Perl匹配正则表达式变量\ Q

时间:2016-09-28 08:48:01

标签: regex perl

我正在尝试匹配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}}弄乱我的正则表达式?

1 个答案:

答案 0 :(得分:4)

\Q\E对可用于转义双引号字符串上下文中的所有非单词字符。例如

perl -E 'say "abc[\Q[..]\E]def"'

输出

abc[\[\.\.\]]def

我想知道为什么你认为你需要它,因为它会阻止所有正则表达式元字符产生特殊效果。例如,\Q[0-9]将完全匹配[0-9]而不是任何单个十进制数字

我会像这样写你的代码。请注意,我在定义模式时将双引号更改为qr//以创建编译的正则表达式,并在定义目标字符串时将单引号更改为单引号以避免Perl尝试插入内置变量{ {1}}进入字符串。您必须始终 $2use 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";
}