找到c ++ regex substring错误模式

时间:2014-09-03 15:48:36

标签: c++ regex

我正在尝试理解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]

1 个答案:

答案 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)");

但是你仍然需要迭代你的字符串。

相关问题