在Perl或Ruby中计算重叠的正则表达式匹配

时间:2012-02-18 18:35:24

标签: ruby regex perl

这是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";

唯一的问题是,它会为测试用例占用太多资源,因为测试用例的匹配计数大约为数百万或更多。但据我所知,这是因为所有的比赛都是先分组,之后才计算。我正在寻找一种资源有效的解决方案,只返回计数

1 个答案:

答案 0 :(得分:6)

看起来tchrist完成了所有艰苦的工作。如果存储匹配并在之后计算它们会占用太多资源,那么您只需更改正则表达式嵌入代码即可计算匹配项:

my $count = 0;

"bbboobb" =~ /(b.*o.*b)(?{$count++})(*FAIL)/g;

print "got $count matches\n";