Perl 正则表达式与变量不匹配相同的文本

发布于 2025-01-08 14:37:43 字数 350 浏览 1 评论 0原文

有人可以向我解释为什么以下打印“失败”吗?解决方法是什么?

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

如果我将 $test1$test1 更改为 "/k?",则匹配有效。

显然它与 ? 后面的文本有关。但是,我试图匹配的变量中有问号,我宁愿不必把所有东西拆开,匹配各个部分,然后重建所有东西。

Could someone explain to me why the following prints "fail"? And what the workaround is?

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

If I change $test1 and $test1 to "/k?", the match works.

Clearly it has something to do with text following the ?. But, the variables I am trying to match have question marks in them, and I would rather not have to take everything apart, match the pieces, and then reconstruct everything.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

要走干脆点 2025-01-15 14:37:43

?正则表达式中的特殊字符。使用 quotemeta

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

? is a special character in a regex. Use quotemeta:

my $test1 = "/k?user";
my $test2 = quotemeta "/k?user";
if ($test1 =~ m/$test2/) {
    print "match";
}
else {
    print "fail";
}
飞烟轻若梦 2025-01-15 14:37:43

要(仅)匹配

/k?user

需要使用该模式,

^/k\?user\z

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

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

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

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

(toolic 之前建议的解决方案也将匹配“!/k?userf”。)

To (only) match

/k?user

one needs to use the pattern

^/k\?user\z

because "?" doesn't match itself in a regex pattern. You need to escape it (use "\?") for it to match a "?", and escaping the special characters (such as "?") can be done using quotemeta.

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

quotemeta can also be accessed via \Q..\E in double-quoted string literals and regex pattern literals.

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

(The solution previously suggested by toolic would also match "!/k?userf".)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文