64,654
社区成员
发帖
与我相关
我的任务
分享
std::string s("123321");
std::smatch m;
std::regex e("([12]*)|(33)");
while (std::regex_search(s, m, e)) {
s = m.suffix().str();
}
http://blog.csdn.net/pdcxs007/article/details/39966151
你参考一下这个
[/quote][/quote]
所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了[/quote]你给的这个例子,和7楼的,是基本上一样的,是有BUG的。 请参考6楼。 [quote=引用 4 楼 fsdffggjnd 的回复:] 我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。 [quote=引用 2 楼 jiht594 的回复:] 你把"为空的"结果抛弃就就行了
这个网站上的例子,其实是有BUG的,也正正就是要解决我的问题的关键所在。 下面的情况,就是一个死循环。 例如:#include <iostream> using namespace std; #include <regex> int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) { std::string s("12321"); std::smatch m; //下面这个正则表达式,不要说改成"([12]+)"。 //因为是外部别人传入的,对我来说是未知的。 //假如别人输入的,就是"([12]*)",我也没有办法。 //所以,我必须加上一个条件,就是排除“空串”。 std::regex e("([12]*)"); while (std::regex_search(s, m, e)) { s = m.suffix().str(); } return 0; }
http://www.cplusplus.com/reference/regex/regex_search/
我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。 [quote=引用 2 楼 jiht594 的回复:] 你把"为空的"结果抛弃就就行了
#include <iostream>
using namespace std;
#include <regex>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
std::string s("12321");
std::smatch m;
//下面这个正则表达式,不要说改成"([12]+)"。
//因为是外部别人传入的,对我来说是未知的。
//假如别人输入的,就是"([12]*)",我也没有办法。
//所以,我必须加上一个条件,就是排除“空串”。
std::regex e("([12]*)");
while (std::regex_search(s, m, e)) {
s = m.suffix().str();
}
return 0;
}
http://www.cplusplus.com/reference/regex/regex_search/
你看一下这种方式能满足你的要求吗?#include <string> #include <iostream> #include <regex> using namespace std; int main() { // regex reg("[ab]*"); // std::string s="cbabc"; regex reg("([12]*)|(33)"); std::string s="123321"; sregex_token_iterator ite(s.begin(), s.end(), reg), end; for ( ; ite != end; ++ite) { cout << ite->str() << endl; } cin.get(); return 0; }
是否能想出好的方法,解决13楼的情况? 所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了
#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main()
{
// regex reg("[ab]*");
// std::string s="cbabc";
regex reg("([12]*)|(33)");
std::string s="123321";
sregex_token_iterator ite(s.begin(), s.end(), reg), end;
for ( ; ite != end; ++ite)
{
cout << ite->str() << endl;
}
cin.get();
return 0;
}
所以才叫你参考. 死循环是因为字符串没变, 你自己移动一位不就好了
我用的是std::regex_search函数,经过试验, 无论字符串中有多少个结果能被匹配中,但regex_search都只返回第一个匹配的结果呀。 regex_search并没有返回所有结果。所以,实现不了你所说的“抛弃为空的结果”。 因为regex_search只返回第一个匹配中的结果给我,它并没有返回所有的(多个)结果给我。 只有一个,抛弃了,就是没有了,我也得不到“非空的”的那些结果。 你把"为空的"结果抛弃就就行了
http://www.cplusplus.com
你把"为空的"结果抛弃就就行了
[quote=引用 楼主 fsdffggjnd 的回复:] 现在的需求是这样的,程序模块化了。 别人从外部传入一个正则表达式,我这边的代码收到后,需要用这个正则表达式,来做匹配。 现在的问题是,我要在别人传入的正则表达式的基础上,加入一个限制条件: 匹配出来的结果,不能为空,即,匹配结果的长度,至少是1。 举例: 如果别人传入的正则表达式,是([ab]*) 那么,如果我直接用它来匹配"cbabc",那么,匹配的结果是:起始位置0,长度0,就是一个空串。 但是,因为要加入一个限制条件,不能为空,所以,期望的结果是"bab"。 现在的问题是,如何在别人的正则表达式上,加入一个“匹配结果不为空的”限制条件呢??
现在的需求是这样的,程序模块化了。 别人从外部传入一个正则表达式,我这边的代码收到后,需要用这个正则表达式,来做匹配。 现在的问题是,我要在别人传入的正则表达式的基础上,加入一个限制条件: 匹配出来的结果,不能为空,即,匹配结果的长度,至少是1。 举例: 如果别人传入的正则表达式,是([ab]*) 那么,如果我直接用它来匹配"cbabc",那么,匹配的结果是:起始位置0,长度0,就是一个空串。 但是,因为要加入一个限制条件,不能为空,所以,期望的结果是"bab"。 现在的问题是,如何在别人的正则表达式上,加入一个“匹配结果不为空的”限制条件呢??