如何获得std :: regex的所有匹配项

时间:2015-10-15 07:31:36

标签: c++ regex c++11 stl

我想找到所有可能的正则表达式匹配,怎么可能?

regex rx("(2|25)");
string s = "2225";
for (sregex_iterator it(s.begin(), s.end(), rx), end; it != end; ++it) {
    cout << it->position() << ": " << it->str() << endl;
}

提供输出:

0: 2
1: 2
2: 25

但完全找不到第三个2: 2。我更喜欢使用正则表达式,因为O(n)复杂度可以同时搜索多个令牌。

更新

也许将令牌列表拆分为不可加前缀的列表并创建多个正则表达式?例如:(2|4|25|45|251|455|267) =&gt; (2|4)(25|45|267)(251|455)这会使复杂性增加到O(n log(m))

更新2:

请提供基于STL的简短算法,将令牌向量拆分为非前缀向量,以回答这个问题。

2 个答案:

答案 0 :(得分:2)

我认为使用迭代器和单个正则表达式是不可能的。这是它的工作原理。

您的正则表达式搜索的字符串是&#34; 2&#34; &#34; 25&#34;。现在,您使用sregex_iterator开始搜索。它从字符串的第一个符号开始,并尝试查找与正则表达式的匹配。如果匹配,则记录&#34;并且迭代器前进到匹配后的位置。如果没有匹配,则迭代器向前推进1位。此过程一直持续到字符串结束。

现在,每次找到匹配项时,它都会尝试从正则表达式中找到最佳(即最长)匹配。因此,如果子字符串与225都匹配,则25需要更长时间。所以我说你需要2个正则表达式。

答案 1 :(得分:1)

您无法获得第三个&#39; 2&#39;因为正则表达式始终返回最长匹配。为了获得所有可能的匹配&#34;你需要运行两次查询,因为2包含在25中。