首页 > 解决方案 > 使用 =~ 运算符进行字符串比较

问题描述

使用 =~ 运算符进行字符串比较

我有两个数组 @a 包含 abc99_xyz ,abc9_xxx 和 @b 包含 abc99 ,abc9 作为字符串,我只想匹配数组 @a 的 abc99_xyz 与 @b 的 abc99 但当我使用时,abc9 也与 @a 的 abc99_xyz 匹配~= 运算符。

代码如下:

@a=qw(abc99_xyz abc9_xxx);
@b=qw(abc99 abc9);

foreach $k(@a)
        {

        foreach $h(@b)
        {
        if($k =~ $h)
        {
        print" $k == $h\n";
        }
     }
 }

只有 abc99_xyz 应该匹配 abc99 而不是 abc9。

标签: perl

解决方案


听起来您需要调整匹配以_在匹配的字符串之后需要。

my @strings = ( 'abc99_xyz', 'abc9_xxx');
my @patterns = ( 'abc99', 'abc9' );
for my $string (@strings) {
    for my $pattern (@patterns) {
        if ( $string =~ /^\Q$pattern\E_/ ) {
            print "$string == $pattern\n";
        }
    }
}

在匹配中,^表示模式必须在字符串的开头匹配,\Q/\E使任何特殊字符$pattern例如*匹配字面意思,并且_使得它需要_紧跟在字符串中的a $pattern

如果您有许多字符串和/或模式,最好在 _ 之前找到每个字符串的部分并使用哈希查找:

my @strings = ( 'abc99_xyz', 'abc9_xxx');
my %patterns = ( 'abc99' => 1, 'abc9' => 1 );
for my $string (@strings) {
    if ( $string =~ /^([^_]+)/ && $patterns{$1} ) {
        print "$string == $1\n";
    }
}

推荐阅读