Regex 带大括号内表达式的Perl正则表达式未按预期工作
我试图理解为什么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和
我已经求助于使用一个单独的变量。我错过了什么?谢谢第一个帖子 在第一个正则表达式中,
{}
卷曲不是表示量词,而是表示文字字符+
仍然是量词(没有像您期望的那样执行加法),并且将匹配$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/;