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

时间:2013-12-04 17:57:19

标签: regex perl

我正在尝试制作一个perl正则表达式,引用它在动态查询中找到的东西。我从来没有试过制作这样的正则表达式,甚至不确定它是否可行。这是我现在的正则表达式:

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

这是为了将我的$sample变量作为查询,并删除与+1X之类的内容匹配的字符串的任何部分。但是,该数字定义了以下字符的数量,我想删除所有这些字符。

因此,如果我的字符串为foo+3xzybar,则正则表达式应返回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

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

我可能会使用匹配来分解字符串,然后稍后重新组合它:

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

所以你得到+ N之前的所有内容,然后使用+ N偏移到正好超出的字母,然后再添加任何其他内容。根据需要重复。

答案 1 :(得分:1)

当一个人愿意使用花哨的(和实验性的)Perl RE功能时,(??{ code })扩展模式有效:

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