我的问题非常简单,我无法使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
答案 0 :(得分:0)
重复捕获组只捕获最后一次迭代。
您必须使用std::regex_search
进行迭代。
答案 1 :(得分:0)
如果您看到例如this C++ regex reference你会看到
regex_match
...尝试将正则表达式与整个字符序列匹配
和
regex_search
...尝试将正则表达式与字符序列的任何部分匹配
[强调我的]
std::regex_match
功能只能找到一个匹配。您应该使用std::regex_search
代替。
答案 2 :(得分:0)
您应该使用regex_match
和regex_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