如何制作perl正则表达式并引用正则表达式中匹配字符串的一部分



我正在尝试制作一个perl正则表达式,该正则表达式引用它在动态查询中找到的内容。我从未尝试过制作这样的regex,甚至不确定它是否可能。这是我当前的正则表达式:

$sample =~ s/(+|-)[1][a-zA-Z]{1}//g;

这意味着将我的$sample变量作为一个查询,并删除字符串中与+1X匹配的任何部分。但是,数字定义了以下字符的数量,我希望删除所有这些字符。

因此,如果我的字符串是foo+3xzybar,那么regex应该返回foobar。如何获取正则表达式中的匹配数字,并使用它来量化要匹配的字母数?而不是写这样明确的案例:

$sample =~ s/(+|-)[1][a-zA-Z]{1}//g;
$sample =~ s/(+|-)[2][a-zA-Z]{2}//g;
$sample =~ s/(+|-)[3][a-zA-Z]{3}//g;
$sample =~ s/(+|-)[4][a-zA-Z]{4}//g;

我想做这样的东西:

$sample =~ s/(+|-)[(0-9)][a-zA-Z]{($1)}//g; #(0-9) is meant to match and save the digit in $1

感谢您的帮助!

我可能会使用一个匹配来分解字符串,然后在一行之后重新组装它:

$sample =~ /(.*?)[+-]([0-9])([a-zA-Z]+)(.*)/ ;
$sample= $1 . substr($3, $2) . $4 if $2 ;

所以你得到+N之前的所有东西,然后用+N偏移到后面的字母中,然后再加上其他东西。如有必要,重复上述步骤。

当人们愿意使用花哨的(实验性的)PerlRE特性时,(??{ code })扩展模式可以工作:

$sample =~ s/[+-](d)(??{ "[a-zA-Z]{$1}" })//g

最新更新