计算某个字符串出现在较大字符串中的次数的最快方法是什么?我最好的猜测是用零替换该字符串的所有实例,计算长度的差异并除以子字符串的长度,但这似乎相当慢,我需要分析大量数据。
答案 0 :(得分:62)
您可以捕获字符串,然后计算它们。可以通过使用()
:
my $x = "foo";
my $y = "foo foo foo bar";
my $c = () = $y =~ /$x/g; # $c is now 3
您还可以捕获到数组并计算数组。同样的原则,不同的技术:
my @c = $y =~ /$x/g;
my $count = @c;
答案 1 :(得分:15)
my $string = "aaaabbabbba";
my @count = ($string =~ /a/g);
print @count . "\n";
或
my $count = ($string =~ s/a/a/g);
答案 2 :(得分:9)
您可以使用全局正则表达式。类似的东西:
my @matches = $bigstring =~ /($littlestring)/g;
my $count = @matches;
答案 3 :(得分:5)
为了完整起见,您可以在循环中重复调用索引函数,并计算它返回字符串中子字符串索引的所有时间,并更改起始位置。这样可以避免使用正则表达式,并且在我的测试中比正则表达式解决方案快一点。
我已经从这里改编了一个子来做{:3}}
sub occurrences {
my( $x, $y ) = @_;
my $pos = 0;
my $matches = 0;
while (1) {
$pos = index($y, $x, $pos);
last if($pos < 0);
$matches++;
$pos++;
}
return $matches;
}