如何在正则表达式模式中使用包含方括号的字符串变量?

时间:2017-01-15 21:11:10

标签: perl

尝试将字符串与括号匹配。

例如:

my $foo = "debug_bus[0]";
my $bar = "debug_bus[0][12:0] = some_value;";

if ($bar =~ $foo)
{
    print "Match\n";
}
else
{
    print "No Match\n";
}

我希望"匹配"但我一直在"没有匹配"这让我相信在[0]' [0]'造成问题?

2 个答案:

答案 0 :(得分:4)

替换

my $foo = "debug_bus[0]";

my $foo = quotemeta "debug_bus[0]";

来自quotemeta文档:

  EXP引言EXPR   返回EXPR的值,所有ASCII非 - " word"字符背面

不使用quotemeta,[0]被解释为bracketed character class,仅包含0,然后仅相当于0

答案 1 :(得分:4)

您需要使用\Q...\E(内部)或metacharacters(外部)

在正则表达式中正确转义(“引用”)quotemeta

因此,您需要:

$bar =~ m/\Q$foo\E/;

或者只是:

$bar =~ /\Q$foo/;

当分隔符为m时,您可以省略//,在这种情况下您实际上不需要\E,因为您的模式中没有其他内容。