使用Perl计算字符串中的连续子字符串数

时间:2019-06-03 18:33:37

标签: perl

我有一个包含多个连续String序列的字符串,例如:

my $ substring =“ CAG”; 我的$ str =“ CAGCAGCAGCAGPGHSMCAGCAG”;

我要计算str中的最大重复子串。

3 个答案:

答案 0 :(得分:2)

my $substring = 'CAG';
my $str = 'CAGCAGCAGCAGPGHSMCAGCAG';
# look for a series of consecutive $substring not followed later by a longer such series
my ($longest_substring) = $str =~ /((?:\Q$substring\E)+)(?!.*?\1\Q$substring\E)/s;
my $repetitions = length($longest_substring // '') / length($substring);

答案 1 :(得分:1)

在列表上下文中带有/g修饰符的匹配运算符将返回所有匹配项。为了对它们进行计数,我们可以对结果施加标量上下文:

my @matches = $str =~ /$substring/g;
my $count = scalar @matches;

返回6。

它可以进一步缩短为

my $count = () = $str =~ /$substring/g;

() =赋值强制列表上下文的情况下,但将其赋给标量变量则强制标量上下文。

请注意,如果匹配项重叠,例如,这不会报告正确的数字

my $str = 'CACACAC';
my $substring = 'CAC';

上面的表达式将返回2,因为与/g的匹配开始搜索最后一个匹配结束的下一个匹配。要解决此问题,请使用不消耗匹配部分的先行断言:

my $count = () = $str =~ /(?=$substring)/g;

答案 2 :(得分:0)

尝试一下:

my $number = () = $str =~ /$substring/gi;
print $number;