如何匹配perl中包含括号的两个字符串

时间:2014-09-23 16:06:08

标签: perl matching

如何匹配包含括号的两个字符串。

perl代码在这里。

#!/usr/bin/perl -w

$a = "cat(S1)rat";
$b = "cat(S1)r";

if ( $a =~ $b ) {
    printf("matching\n");
}

我没有得到所需的输出。

请帮助

SNK

3 个答案:

答案 0 :(得分:3)

这里有几个答案,但不是很多解决你的根本误解。

以下是您问题的简化版本:

my $str = "tex(t)";
my $pattern = "tex(t)";

if ($str =~ $pattern) {
  print "match\n";
} else {
  print "NO MATCH\n";
}

打印出NO MATCH

原因是=~运算符的行为。 该运算符左侧的东西被视为字符串,右侧的东西被视为模式(正则表达式)。

括号在模式中有特殊含义,但在字符串中没有。

对于上面的具体示例,您可以使用以下命令修复它:

my $str = "tex(t)";
my $pattern = "tex\\(t\\)";

更一般地说,如果您想要转义$pattern中的“特殊字符”(例如*.等),则可以使用\Q...\E语法其他人提到了。

有意义吗?

通常,您没有看到表示为字符串的模式(与"tex(t)"一样)。 写这个的更常见方式是:

if ($str =~ /tex(t)/)

可以通过写作来解决:

if ($str =~ /tex\(t\)/)

请注意,在这种情况下,由于您使用的是正则表达式对象(/.../语法),因此您不需要像对引用的字符串那样对反斜杠进行双重转义。

答案 1 :(得分:1)

你必须逃避括号:

if ( $a =~ /\Q$b/ ) {
    print "matching\n";
}

请尽量避免使用变量名称$a$b保留用于排序 此外,此处无需使用printf

答案 2 :(得分:1)

试试这段代码:

my $p = "cat(S1)rat";
my $q = "cat(S1)r";

if ( index( $p, $q ) == -1 ) {
    print "Does not match";
} else {
    print "Match";
}