gpt4 book ai didi

regex - 如果正则表达式和字符串都是变量,如何在 perl 中使用正则表达式

转载 作者:行者123 更新时间:2023-12-01 09:46:08 25 4
gpt4 key购买 nike

我有两个来自某些用户输入的变量。一个是需要检查的字符串,另一个是正则表达式,如下所示。

以下代码无效。

my $pattern = "/^current.*$/";
my $name = "currentStateVector";

if($name =~ $pattern) {
print "matches \n";
} else {
print "doesn't match \n";
}

下面是。

if($name =~ /^current.*$/) {
print "matches \n";
} else {
print "doesn't match \n";
}

这是什么原因。我将正则表达式存储在一个变量中。是否有另一种方法来存储或修改此变量?

最佳答案

double-quotes您使用 interpolate - 它们首先评估其中的内容(变量、转义符等)并返回一个由评估结果和剩余文字构建的字符串。参见 Gory details of parsing quoting constructs进行有启发性的讨论,其中包含很多细节。

你的示例字符串恰好有一个 $/ ,它是 Perl 的全局变量之一(参见 perlvar )所以 $pattern 与预期的不同;打印出来看看。 (在这种情况下,/ 是错误的,如下所述,但这一点是成立的。)

相反,要么使用单引号来避免解释像 $\(等)这样的字符,以便它们在正则表达式中使用

my $pattern = q(^current.*$);

或者,更好的是,使用特定于正则表达式的 qr operator

my $pattern = qr/^current.*$/;

从它的字符串构建一个合适的正则表达式模式(一种特殊类型的 Perl 值),并允许使用修饰符。在这种情况下,如果您希望将它们视为文字,则需要转义在正则表达式中具有特殊含义的字符。

请注意,正则表达式不需要 //,而且它们无论如何都不会成为模式的一部分——将它们放在实际模式周围是错误的。

此外,请仔细考虑可能最终使用用户输入的所有情况。


评论中提到用户可以提交带有额外 / 的“模式”。如上所述,那是错误的;只应给出模式本身(在命令行中用 ' 包围,这样 shell 就不会解释其中的特定字符)。更多细节如下。

/ 显然不是模式的一部分,而是要与匹配运算符一起使用,以定界(引用)正则表达式模式本身(在较大的表达式中) 以便可以在模式中使用字符串文字。或者它们用于清晰,和/或能够指定全局修饰符(即使这些修饰符也可以在模式内部指定)。

但是如果用户仍然在模式周围键入它们,则正则表达式将使用这些字符作为模式的一部分,并尝试匹配前导 / 等;它会悄悄地失败。确保用户知道他们需要单独提供一个模式,没有分隔符。

如果这可能是个问题,我会检查定界符,如果找到则继续发出“响亮”(清晰)的警告。使这变得棘手的是,以斜线开始和结束的模式是合法的——如果不太可能,用户可能希望在他们的模式中使用实际的 / 。所以你只能询问,或者发出警告,而不能中止。

请注意,对于在变量中给出的模式,或使用在运行时产生模式的表达式,匹配不需要显式匹配运算符和定界符;变量或表达式的返回作为搜索模式并用于匹配。参见 The basics (perlre)Binding Operators (perlop) .

所以你可以简单地做 $name =~ $pattern。当然 $name =~/$pattern/ 也可以,你可以在结束后给出全局修饰符 /

关于regex - 如果正则表达式和字符串都是变量,如何在 perl 中使用正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58663971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com