【发布时间】:2015-10-15 07:31:35
【问题描述】:
我想找到所有可能的正则表达式匹配,怎么可能?
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) => (2|4), (25|45|267), (251|455) 这会将复杂度增加到类似于 O(n log(m))
更新 2:
请提供基于 STL 的将标记向量拆分为不可前缀向量的简短算法来回答此问题。
【问题讨论】:
-
如果您只想匹配
2上的匹配项,为什么要使用|25作为正则表达式的一部分? -
@Phylogenesis 我想发现
O(n)complex 的所有 4 个匹配项:) -
我相信你不能在两个不同的匹配组中匹配同一个字符(即你不能匹配
2作为25的一部分,但也不能单独匹配)。 -
@k06a 在这种情况下,为什么要使用正则表达式?这变成了一个简单的文本搜索问题。
-
正则表达式不仅会降低算法复杂性。您必须检查每个
n字符是否是m不同字符串的开头。根据您的搜索空间的性质,您将很难找到比O(nm)工作得更好的算法(您真正希望的最好方法是进行一些预先计算以找到匹配的前缀)。