我试图理解 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";
这种形式不应该给我匹配我的模式的子字符串的数量吗?因为它总是给我 1 个匹配项并且它说匹配项是 [Ni , Ni];
但我需要它来找到每个模式;它们应该是 3 并且像这样 [Ni][Ni][Ni]
函数 std::regex_search 只返回在您的字符串中找到的第一个匹配项的结果。
这是一个代码,从你的和 cplusplus.com 合并而来。这个想法是搜索第一个匹配项,对其进行分析,然后使用字符串的其余部分重新开始(也就是说,直接跟随找到的匹配项的子字符串,可以通过 match_results::suffix 检索到) .
请注意,正则表达式有两个捕获组 (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)");
不过,您仍然需要遍历您的字符串。
我是一名优秀的程序员,十分优秀!