C ++正则表达式只找到1个子匹配

时间:2017-06-22 18:32:45

标签: c++ regex

// Example program
#include <iostream>
#include <string>
#include <regex>
int main()
{
 std::string strr("1.0.0.0029.443");

    std::regex rgx("([0-9])");
    std::smatch match;

    if (std::regex_search(strr, match, rgx)) {
        for(int i=0;i<match.size();i++)
            std::cout << match[i] << std::endl;
    }
}

这个程序应该写

1
0
0
0
0
2
9
4
4
3

但它写了

1
1

在这里http://cpp.sh/和视觉工作室检查了两个相同的结果。

为什么它只找到2个匹配,为什么它们相同?

正如我从这里的答案中理解的那样,正则表达式搜索在第一次匹配时停止并且匹配变量保持必要的(子?)字符串值以继续(通过重复)其他匹配。此外,由于它在第一场比赛时停止,()字符仅用于结果中的子匹配。

2 个答案:

答案 0 :(得分:4)

被叫一次,regex_search只返回match变量中的第一个匹配项。 match中的集合包含匹配本身和捕获组(如果有)。

为了让所有匹配在循环中调用regex_search

while(regex_search(strr, match, rgx))
{
    std::cout << match[0] << std::endl;
    strr = match.suffix();
}

请注意,在您的情况下,第一个捕获组与整个匹配相同,因此组中不需要,您可以将正则表达式简单地定义为[0-9](不带括号)。

演示:https://ideone.com/pQ6IsO

答案 1 :(得分:1)

问题:

  1. 使用if只能为您提供一个匹配项。您需要使用while循环来查找所有匹配项。您需要在循环的下一次迭代中搜索上一个匹配项。
  2. std::smatch::size()返回1 +匹配数。见its documentationstd::smatch可以包含子匹配。要获取整个文本,请使用match[0]
  3. 这是您的计划的更新版本:

    #include <iostream>
    #include <string>
    #include <regex>
    
    int main()
    {
       std::string strr("1.0.0.0029.443");
    
       std::regex rgx("([0-9])");
       std::smatch match;
    
       while (std::regex_search(strr, match, rgx)) {
          std::cout << match[0] << std::endl;
          strr = match.suffix();
       }
    }