我正在尝试理解c ++中regex
的逻辑
std::string s ("Ni Ni Ni NI");
std::regex e ("(Ni)");
std::smatch sm;
std::regex_search (s,sm,e);
std::cout << "string object with " << sm.size() << " matches\n";
这个表格不应该给我匹配我的模式的子串数?因为它总是给我一个匹配,它说匹配是[Ni , Ni];
但我需要它来找到每一个模式;它们应该是3并且像这样[Ni][Ni][Ni]
答案 0 :(得分:1)
函数std::regex_search仅返回字符串中找到的第一个匹配项的结果。
这是一段代码,由您和cplusplus.com合并而来。我的想法是搜索第一个匹配,分析它,然后再使用字符串的其余部分重新开始(也就是说,直接跟随找到的匹配的子字符串,这可以通过{{ 3}})。
请注意,正则表达式有两个捕获组(Ni*)
和([^ ]*)
。
std::string s("the knights who say Niaaa and Niooo");
std::smatch m;
std::regex e("(Ni*)([^ ]*)");
while (std::regex_search(s, m, e))
{
for (auto x : m)
std::cout << x.str() << " ";
std::cout << std::endl;
s = m.suffix().str();
}
这给出了以下输出:
Niaaa Ni aaa
Niooo Ni ooo
如您所见,对于每次调用regex_search,我们都有以下信息:
由于我们有两个捕获组,因此每个regex_search为我们提供了3个字符串。
编辑:在您的情况下,如果您想要检索每个“Ni”,您需要做的就是替换
std::regex e("(Ni*)([^ ]*)");
与
std::regex e("(Ni)");
但是你仍然需要迭代你的字符串。