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

k06*_*06a 8 c++ regex stl c++11

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

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;
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

0: 2
1: 2
2: 25
Run Code Online (Sandbox Code Playgroud)

但是找不到第三名2: 2.我更喜欢使用正则表达式,因为O(n)同时搜索多个令牌的复杂性.

更新:

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

更新2:

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

Sin*_*all 2

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

您的正则表达式搜索“2”“25”的子字符串。现在,您可以使用 开始搜索sregex_iterator。它从字符串的第一个符号开始,并尝试查找与正则表达式的匹配项。如果存在匹配,则将其“记录”,并且迭代器前进到匹配之后的位置。如果没有匹配,则迭代器向前移动 1 个位置。此过程持续进行,直到到达字符串末尾。

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