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

Regex Perl中字符串之间的字符匹配计数,regex,perl,Regex,Perl,我有一个字符串(比如字符串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"

我有一个字符串(比如字符串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";
如何修复此问题?

您可以使用:

#!/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
或者,您可以使用以数组形式获取所有字符,并循环:

#!/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
fc
lc
提供更准确的结果,但我选择向后兼容。)

未测试

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')
sub-cm
{
我的@a=班次;
我的@b=班次;
#字符串的第一个匹配前缀:
我的$n=0;
而($n<$#a和$n<$#b和$a[$n]eq$b[$n]){
++$n;
}
#然后跳过两边的一个字符,并递归。
如果($n<$#a&$n<$#b){
#通过跳过一个位置来匹配rest:
我的$n2best=0;
my$n2a=cm(拼接(@a,$n),拼接(@b,$n+1));
$n2best=$n2a;
my$n2b=cm(拼接(@a,$n+1),拼接(@b,$n));
$n2best=$n2b如果$n2b>$n2best;
my$n2c=cm(拼接(@a,$n+1),拼接(@b,$n+1));
如果$n2c>$N2Cest,则$N2Cest=$n2c;
$n+=$n2best;
}
返回$n;
}
子计数\u匹配
{
我的$a=班次;
我的$b=班次;
我的@a_chars=split/,$a;
我的@b_chars=split/,$b;
返回厘米(@a_字符,@b_字符);
}
打印计数\u匹配('陌生人','陌生人')

异或,然后计算空字符数(其中字符串相同):


我漏掉了“区分大小写”部分。

您想要0还是2表示
aabb
bbcc
?如果是0,您想要1还是2表示abc和azc?Hi Ikegami,应该是0。Hi ysth,应该是2以上代码工作正常。您能提供“^”和tr/\0//代表什么吗?
^
是its中使用的。当两个输入字符串具有相同字符时,它将生成一个具有\0的字符串
tr
是这里用来计数字符的,你不需要
c
修饰符吗?例如,
tr/\0//c
@CJ7将对不匹配项进行计数,该问题要求对匹配项进行计数
my $string1 = "stranger";
my $string2 = "strangem";
my $count = ( lc $string1 ^ lc $string2 ) =~ tr/\0//;

print "$count\n";