我想找到所有可能的正则表达式匹配,怎么可能?
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的简短算法,将令牌向量拆分为非前缀向量,以回答这个问题。
答案 0 :(得分:2)
我认为使用迭代器和单个正则表达式是不可能的。这是它的工作原理。
您的正则表达式搜索的字符串是&#34; 2&#34; 或&#34; 25&#34;。现在,您使用sregex_iterator
开始搜索。它从字符串的第一个符号开始,并尝试查找与正则表达式的匹配。如果匹配,则记录&#34;并且迭代器前进到匹配后的位置。如果没有匹配,则迭代器向前推进1位。此过程一直持续到字符串结束。
现在,每次找到匹配项时,它都会尝试从正则表达式中找到最佳(即最长)匹配。因此,如果子字符串与2
和25
都匹配,则25
需要更长时间。所以我说你需要2个正则表达式。
答案 1 :(得分:1)
您无法获得第三个&#39; 2&#39;因为正则表达式始终返回最长匹配。为了获得所有可能的匹配&#34;你需要运行两次查询,因为2包含在25中。