Perl正则表达式与花括号内的表达不按预期工作

时间:2014-12-19 14:23:13

标签: regex perl

我试图理解为什么Perl似乎没有评估用于在匹配中定义特定出现次数的花括号中的表达式:

表达式:

$ perl -e '$a=2;print "abbbc" =~ m/b{$a+1}/ ? "match\n" : "no match\n";'
no match

没有表达式:

$ perl -e '$a=3;print "abbbc" =~ m/b{$a}/ ? "match\n" : "no match\n";'
match

我已经使用了一个单独的变量。我在这里错过了什么?谢谢......第一次发布!

3 个答案:

答案 0 :(得分:3)

正则表达式中的变量插值就像字符串中的变量插值。它不会将整个字符串作为表达式进行评估,只需要完成变量即可。试试这个:

$a = 3;
print "{$a+1}\n";

你会看到你的正则表达式发生了什么。 $a已被替换,+1仍为+1/x{1+1}/不等同于/x{2}/

您使用单独变量的方法是我使用的方法。但还有其他可能性,比如

$a = 3;
print "{${\($a+1)}}\n";
print "yes\n" if "abbbbc" =~ /ab{${\($a+1)}}c/;

${\(...)}包装器使表达式成为插值的单个单位。但它很难看。另一个版本是使用@{[...]}这样的数组:

$a = 3;
print "yes\n" if "abbbbc" =~ /ab{@{[$a+1]}}c/;

我认为这些都比

更丑陋
$a = 3;
$aplus1 = $a + 1;
print "yes\n" if "abbbbc" =~ /ab{$aplus1}c/;

答案 1 :(得分:1)

在第一个正则表达式中,{} curlies不代表量词,而是字面字符。 +仍然是量词的(不按照您的预期执行添加)并且会匹配$a 1次或多次,因此正则表达式设置为匹配字符串,

perl -e '$a=2;print "ab{222221}bbc" =~ /(b{$a+1})/'

输出

b{222221}

请参阅perlre

  

{n,m} n和m仅限于非负数          小于建立perl时定义的预设限制的整数值。

答案 2 :(得分:1)

变量在正则表达式中被替换,正如您在第二个命令中找到的那样,但它不是正则表达式编译器执行代码的标准功能。然而,有一个实验性的特征(至少,我认为它仍然是实验性的),它允许这样做:

perl -e '$a=2;print "abbbc" =~ m/^a(??{"b\{".($a+1)."\}"})c$/ ? "match\n" : "no match\n";'

您可以在perldoc中找到有关该信息的更多信息,但请注意它有limitations。就个人而言,如果其他人试图维护代码并且不了解该功能,我会对此保持警惕。

编辑:单身?嵌入式代码的版本不正确,更新版本插件很丑(即使你要整理它)!继续更新正则表达式之外的变量并保持可读性!