【发布时间】:2012-03-09 18:45:36
【问题描述】:
这是that question 的后续行动。我了解到在 Python 中查找重叠的正则表达式匹配并不简单,因此决定做一个额外的调查,看看 Perl 和 Ruby 是如何完成这项任务的。
我想计算正则表达式与某个字符串的所有可能匹配项的数量。 “全部”是指结果应考虑重叠和非唯一匹配。以下是一些示例:
-
a.*k应该在"akka"中匹配两次 -
"bbboob"针对b.*o.*b进行测试应该产生 6
作为参考,这是tchrist 建议的 Perl 单行代码 - 它输出正确的匹配项及其计数:
() = "bbboobb" =~ /(b.*o.*b)(?{push @all, $1})(*FAIL)/g; printf "got %d matches: %s\n", scalar(@all), "@all";
唯一的问题是它消耗了太多的资源用于测试用例,结果匹配数达到数百万或更多。但我知道这是因为所有比赛都是先分组,然后才计算在内。我正在寻找一种只返回计数的资源节约型解决方案。
【问题讨论】:
-
如果您有计算机科学意义上的正则表达式,这可以通过 O(RN) 中的 NFA 轻松完成,其中 R 和 N 是正则表达式和输入字符串的长度)。
-
@Nabb 但是除非你使用 RE2(你实际上可以在 Perl 中使用它),否则你不会得到 NFA。你有一个递归回溯器。请参阅 Russ Cox 的论文。