Perl Regex,变量与同一文本不匹配

时间:2012-02-23 22:15:43

标签: regex perl

有人可以向我解释这里发生了什么吗?解决方法是什么?

my $test1 = "/k?user";
my $test2 = "/k?user";
if ($test1 =~ m/$test2/) {
    print "match";
}
else {
    print "fail";
}

每次都为我打印“失败”。如果我将$test1$test1更改为"/k?",则匹配有效

显然它与文字后面的内容有关?但是我想要匹配的变量在它们中有问号,我宁愿不必把所有东西分开,匹配碎片,然后重建一切。

任何想法???

2 个答案:

答案 0 :(得分:4)

?special character in a regex。使用quotemeta

my $test1 = "/k?user";
my $test2 = quotemeta "/k?user";
if ($test1 =~ m/$test2/) {
    print "match";
}
else {
    print "fail";
}

答案 1 :(得分:2)

要(仅)匹配

/k?user

需要使用模式

^/k\?user\z

因为“?”在正则表达式模式中与自身不匹配。您需要将其转义(使用“\?”)以匹配“?”,并且可以使用{{转义特殊字符(例如“?”)来完成转义3}}

my $str = '/k?user';
my $pat = quotemeta($str);
/^$pat\z/

quotemeta也可以通过\Q..\E在双引号字符串文字和正则表达式模式文字中访问。

my $str = '/k?user';
/^\Q$str\E\z/

(以前由工具提出的解决方案也会匹配“!/k?userf”。)