c ++ 11正则表达式打印所有组

时间:2018-01-29 15:00:18

标签: c++ regex c++11

我的问题非常简单,我无法使c ++ 11正则表达式返回字符串中的所有组。

下面的代码是我正在使用的代码:

#include <iostream>
#include <regex>

int main()
{
  auto fixMessage("8=FIXT|9=69|35=5|34=18|49=102|56=asd|115=TESTTESTTEST|52=20170810-15:36:22.500867816|1409=42|");
  std::regex e ("(([0-9]+)=(.*?)\\|)+?");
  std::cmatch element_match;

  if(std::regex_match(fixMessage, element_match, e)) {
        for (size_t i = 0; i < element_match.size(); ++i) {
            std::cout << i << ": " << element_match[i] << '\n';
        }
  }
  return 0;
}

这只打印此

0: 8=FIXT|9=69|35=5|34=18|49=102|56=asd|115=TESTTESTTEST|52=20170810-15:36:22.500867816|1409=42|
1: 1409=42|
2: 1409
3: 42

虽然我想让所有团体不仅仅是最后一个团体..  here is a cpp.sh url

3 个答案:

答案 0 :(得分:0)

重复捕获组只捕获最后一次迭代。

您必须使用std::regex_search进行迭代。

答案 1 :(得分:0)

如果您看到例如this C++ regex reference你会看到

  

regex_match ...尝试将正则表达式与整个字符序列匹配

  

regex_search ...尝试将正则表达式与字符序列的任何部分匹配

[强调我的]

std::regex_match功能只能找到一个匹配。您应该使用std::regex_search代替。

答案 2 :(得分:0)

您应该使用regex_matchregex_search的组合。第一个可以用来检查整个字符串的有效性,第二个可以用来提取所有匹配的组:

#include <string>
#include <iostream>
#include <regex>

int main() 
{

    std::string s("8=FIXT|9=69|35=5|34=18|49=102|56=asd|115=TESTTESTTEST|52=20170810-15:36:22.500867816|1409=42|");
    std::regex re("((\\d+)\\=([^|]*?)\\|)+?");

    if (std::regex_match(s, re)) 
    {
        for (std::smatch m; std::regex_search(s, m, re); s = m.suffix())
        {
            std::cout << m[1] << "\t\t" << m[2] << "\t\t" << m[3] << std::endl;
        }
    }

    return 0;
}

请注意,我稍微调整了正则表达式。由于“抓取”正则表达式性质,您需要使用([^|]*?)而不是(.*?)来捕获=和以下|之间的所有内容。当您想要检查整体时,这一点很明显regex_match

的字符串格式

打印:

8=FIXT|         8               FIXT
9=69|           9               69
35=5|           35              5
34=18|          34              18
49=102|         49              102
56=asd|         56              asd
115=TESTTESTTEST|               115             TESTTESTTEST
52=20170810-15:36:22.500867816|         52              20170810-15:36:22.500867816
1409=42|                1409            42