在Perl中计算字符串之间的字符匹配数

3

我有一个字符串(称为字符串1),需要与另一个字符串(字符串2)匹配。这两个字符串的长度相同,且不区分大小写。

我想打印出两个字符串之间字符匹配的数量。

E.g.: String 1: stranger
      String 2: strangem

      Match count = 7

我尝试了这个:

$string1 = "stranger";
$string2 = "strangem";
my $count = $string1 =~ m/string2/ig;

print "$count\n";

我该怎么解决这个问题?


2
你想要 aabbbbcc 的结果是0还是2? - ikegami
1
如果是0,你想要abc和azc中的1还是2? - ysth
嗨,Ikegami,应该是0。 - I am
嗨ysth,应该是2。 - I am
3个回答

4
异或,然后计算空字符的数量(在字符串相同的位置):
my $string1 = "stranger";
my $string2 = "strangem";
my $count = ( lc $string1 ^ lc $string2 ) =~ tr/\0//;

print "$count\n";

我漏掉了“大小写不敏感”的部分。


以上代码运行良好。请问“^”和“tr/\0//”代表什么? - I am
1
^异或运算符,在此处使用其字符串模式。它将生成一个字符串,其中任何两个输入字符串具有相同字符的位置都为\0。tr转译运算符,在此仅用于计数字符。 - ysth
你不需要使用 c 修饰符吗?例如:tr/\0//c - CJ7
1
@CJ7 这将计算非匹配项,而问题要求匹配项的计数。 - ysth

3
您可以使用 substr 进行操作:
#!/usr/bin/perl
use warnings;
use strict;

my $string1=lc('stranger');
my $string2=lc('strangem');
my $count=0;
for (0..length($string1)-1) {
    $count++ if substr($string1,$_,1) eq substr($string2,$_,1);
}
print $count; #prints 7

或者您可以使用split将所有字符作为数组获取,并循环:

#!/usr/bin/perl
use warnings;
use strict;

my $string1=lc('stranger');
my $string2=lc('strangem');
my $count=0;
my @chars1=split//,$string1; 
my @chars2=split//,$string2;
for (0..$#chars1) {
    $count++ if $chars1[$_] eq $chars2[$_];
}
print $count; #prints 7

(fclc更准确,但我选择了向后兼容性.)


0

未经测试

sub cm
{
    my @a = shift;
    my @b = shift;

    # First match prefix of string:
    my $n = 0;
    while ($n < $#a && $n < $#b && $a[$n] eq $b[$n]) {
       ++$n;
    }
    # Then skip one char on either side, and recurse.
    if ($n < $#a && $n < $#b) {
       # Match rest by skipping one place:
       my $n2best = 0;
       my $n2a = cm(splice(@a, $n), splice(@b, $n + 1));
       $n2best = $n2a;
       my $n2b = cm(splice(@a, $n + 1), splice(@b, $n));
       $n2best = $n2b if $n2b > $n2best;
       my $n2c = cm(splice(@a, $n + 1), splice(@b, $n + 1));
       $n2best = $n2c if $n2c > $n2best;
       $n += $n2best;
    }
    return $n;
}

sub count_matches
{
    my $a = shift;
    my $b = shift;

    my @a_chars = split //, $a;
    my @b_chars = split //, $b;
    return cm(@a_chars, @b_chars); 
}

print count_matches('stranger', 'strangem')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接