有人可以向我解释这里发生了什么吗?解决方法是什么?
my $test1 = "/k?user";
my $test2 = "/k?user";
if ($test1 =~ m/$test2/) {
print "match";
}
else {
print "fail";
}
每次都为我打印“失败”。如果我将$test1
和$test1
更改为"/k?"
,则匹配有效
显然它与文字后面的内容有关?但是我想要匹配的变量在它们中有问号,我宁愿不必把所有东西分开,匹配碎片,然后重建一切。
任何想法???
答案 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
”。)