计算另一个(Perl)内的字符串出现次数

时间:2012-03-02 18:31:47

标签: regex perl substring

计算某个字符串出现在较大字符串中的次数的最快方法是什么?我最好的猜测是用零替换该字符串的所有实例,计算长度的差异并除以子字符串的长度,但这似乎相当慢,我需要分析大量数据。

4 个答案:

答案 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;
}