我正在尝试匹配perl中的正则表达式。正则表达式需要存储在变量中。
从this question我得到$regex = "\\$[0-9] (\\+|\\*) [0-9]";
$str = "$2 * 2";
if ($str =~ /\Q$regex/) { # regex is: \$[0-9] (\+|\*) [0-9]
print "Expression found :)\n";
} else {
print "Expression not found :(\n";
}
以匹配变量中的正则表达式。
$regex
这在regexpal中匹配正常。当我立即使用正则表达式而没有先将其放入\Q
(即没有\Q
)时,它也可以正常工作。什么是{{1}}弄乱我的正则表达式?
答案 0 :(得分:4)
\Q
和\E
对可用于转义双引号字符串上下文中的所有非单词字符。例如
perl -E 'say "abc[\Q[..]\E]def"'
abc[\[\.\.\]]def
我想知道为什么你认为你需要它,因为它会阻止所有正则表达式元字符产生特殊效果。例如,\Q[0-9]
将完全匹配[0-9]
而不是任何单个十进制数字
我会像这样写你的代码。请注意,我在定义模式时将双引号更改为qr//
以创建编译的正则表达式,并在定义目标字符串时将单引号更改为单引号以避免Perl尝试插入内置变量{ {1}}进入字符串。您必须始终 $2
和use strict
在您编写的每个Perl程序的顶部
use warnings 'all'
use strict;
use warnings 'all';
my $regex = qr/\$[0-9] [+*] [0-9]/;
my $str = '$2 * 2';
if ( $str =~ $regex ) {
print "Expression found :)\n";
}
else {
print "Expression not found :(\n";
}