regex - 带有花括号内表达式的 Perl 正则表达式无法按预期工作

标签 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

我求助于使用单独的变量。我在这里缺少什么?谢谢...第一篇文章!

最佳答案

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

$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/;

关于regex - 带有花括号内表达式的 Perl 正则表达式无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567965/

相关文章:

where 子句中的 mySQL 正则表达式

python - 如何将带分隔符的字符串拆分成一个集合?

perl - 使用 Perl 对目录文件名进行排序

perl - 无法从 CPAN (Perl) 安装

java - 如何删除字符串之间的空格

javascript - 需要帮助创建一个用于密码验证的正则表达式

JavaScript 正则表达式(替换)如果在其他单词之后没有单词

regex - bash 脚本中的 Perl 命令不是解释命令(它实际上是替换它)

linux - 如何自动刷新linux "echo -n"

python - 将 Perl 正则表达式转换为 python 正则表达式