Regex 带大括号内表达式的Perl正则表达式未按预期工作

Regex 带大括号内表达式的Perl正则表达式未按预期工作,regex,perl,Regex,Perl,我试图理解为什么Perl似乎不计算大括号内的表达式,而大括号用于定义匹配中的特定发生次数: 带着表情: 没有表情: 我已经求助于使用一个单独的变量。我错过了什么?谢谢第一个帖子 在第一个正则表达式中,{}卷曲不是表示量词,而是表示文字字符+仍然是量词(没有像您期望的那样执行加法),并且将匹配$a1次或多次,因此将regex设置为匹配字符串,如 perl -e '$a=2;print "ab{222221}bbc" =~ /(b{$a+1})/' 输出 b{222221} 见: {n,m}n和

我试图理解为什么Perl似乎不计算大括号内的表达式,而大括号用于定义匹配中的特定发生次数:

带着表情: 没有表情:
我已经求助于使用一个单独的变量。我错过了什么?谢谢第一个帖子

在第一个正则表达式中,
{}
卷曲不是表示量词,而是表示文字字符
+
仍然是量词(没有像您期望的那样执行加法),并且将匹配
$a
1次或多次,因此将regex设置为匹配字符串,如

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

b{222221}
见:

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


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

perl -e '$a=2;print "abbbc" =~ m/^a(??{"b\{".($a+1)."\}"})c$/ ? "match\n" : "no match\n";'
您可以在中找到更多关于这方面的信息,但请注意,它有其独特的功能。就我个人而言,我会对它保持警惕,以防其他人试图维护代码而不知道该功能


编辑:单曲?嵌入代码的版本不正确,更新后的版本很难看(即使你要整理一下)!在正则表达式之外更新变量,并保持可读性

regexp中的变量插值类似于字符串中的变量插值。它不会将整个字符串作为一个表达式进行求值,就像完成一个变量所必需的那样。试试这个:

$a = 3;
print "{$a+1}\n";
您将看到您的regexp中发生了什么。将替换
$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/;

“abbbc”=~m/b(?{$a+1})/
可能与您认为的不匹配。还有
/abb{$a}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/;