C++ 如何获取std::regex的所有可能匹配项
我想找到所有可能的正则表达式匹配项,怎么可能C++ 如何获取std::regex的所有可能匹配项,c++,regex,c++11,stl,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; } 但无法准确地找到第三个2:2。我更喜欢使用正则表达
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;
}
但无法准确地找到第三个2:2
。我更喜欢使用正则表达式,因为同时搜索多个令牌的复杂性
更新:
也许可以将令牌列表拆分为不可前缀的列表并创建几个正则表达式?例如:(2 | 4 | 25 | 45 | 251 | 455 | 267)
=>(2 | 4),(25 | 45 | 267)
(251 | 455)这将使复杂性增加到类似于O(n log(m))
更新2:
请提供将标记向量拆分为不可前缀向量的基于STL的简短算法来回答这个问题。我认为使用迭代器和单个regexp是不可能的。下面是它的工作原理 您的regexp搜索的子字符串为“2”或“25”。现在,使用
sregex\u迭代器开始搜索。它以字符串的第一个符号开始,并尝试查找与正则表达式匹配的项。如果存在匹配,则会“记录”,迭代器将前进到匹配后的位置。如果没有匹配项,迭代器将前进1个位置。此过程将继续,直到到达字符串的末尾
现在,每次找到匹配项时,它都会尝试从正则表达式中找到最佳(即最长)匹配项。因此,如果子字符串同时匹配2
和25
,则需要25
,因为它较长。所以我认为您需要2个正则表达式。您无法获得第三个“2”,因为正则表达式总是返回最长的匹配。为了获得“所有可能的匹配项”,您需要运行两次查询,因为25中包含2。如果您只想在2
上匹配,为什么要将|25
用作正则表达式的一部分?@Phylogenesis我想找出O(n)的所有4个匹配项
complexity:)我相信你不能在两个不同的匹配组中匹配同一个字符(即,你不能将2
作为25
的一部分,但也不能单独匹配)。@k06a在这种情况下,为什么要使用regex?这就变成了一个简单的文本搜索问题。正则表达式不仅会降低算法的复杂性。您必须检查n
字符中的每一个是否都是m
不同字符串的开头。根据搜索空间的性质,您将很难找到一种比O(nm)
更有效的算法(您真正希望的最好方法是进行一些预计算以找到匹配的前缀)。请帮助我避免m
正则表达式,每种算法只包含一个标记:)复杂性增加到O(nm)
:(我认为它实际上并不匹配最长的匹配,而是匹配第一个匹配。交替的顺序很重要:看这个。@系统发育,这很有趣,因为在我的机器上,结果正好相反(rx1
发现2 25
和rx2
发现2
)std:(基本)如果我没有弄错的话,regex
应该默认使用ECMAScript规则,这应该更喜欢第一个匹配选项。如果使用extended/POSIX,它将更喜欢较长的IIRC。试试这个:@k06a,如果子表达式不是任何其他子表达式的前缀,您可以对它们进行分组,例如,您可以对3 | 45
进行分组,因为3
不是45的前缀
0: 2
1: 2
2: 25