Regex 如何使perl正则表达式和引用成为正则表达式中匹配字符串的一部分?

Regex 如何使perl正则表达式和引用成为正则表达式中匹配字符串的一部分?,regex,perl,Regex,Perl,我试图创建一个perl正则表达式,它引用它在动态查询中找到的东西。我从未尝试过制作这样的正则表达式,甚至不确定它是否可行。以下是我当前的正则表达式: $sample =~ s/(+|-)[1][a-zA-Z]{1}//g; 这意味着将我的$sample变量作为一个查询,并删除字符串中与+1X之类内容匹配的任何部分,而不删除任何内容。但是,数字定义了以下字符的数量,我希望删除所有字符 因此,如果我的字符串是foo+3xzybar,则正则表达式应该返回foobar。如何在正则表达式中获取匹配的数字

我试图创建一个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
我想做这样的东西:

$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偏移到后面的字母中,然后在后面钉上任何其他内容。必要时重复。

当您愿意使用花哨(和实验性)的Perl RE特性时,扩展模式可以工作:

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

在纯正则表达式中,你不能。你必须提取整数,然后用它来确定字符数。我认为你不能用正则表达式的早期部分找到的东西对正则表达式的其余部分进行结构修改。你可以试试
s/(?:[-+])([\d])[a-zA-Z]{\1}//g
,但如果它能起作用,我会感到非常惊讶。@JonathanLeffler嗯,实际上它可以用Perl-RE来完成,请看我的答案。这既非常酷,又非常可怕。老天保佑一个后来出现的维护者,他必须弄清楚这是怎么回事。但这可以说是几乎所有的正则表达式,甚至一些人认为是perl。(我的朋友称Perl为只写语言)。它是实验性的,但除此之外……哇。这肯定不是你祖父的正则表达式!URL在拼写为:
http://perldoc.perl.org/perlre.html#(%3f%3f%7b代码-%7d)
;拼写
http://perldoc.perl.org/perlre.html#%28%3f%3f%7b-代码-%7d%29
。当我输入它时,我包括了括号;因此,将括号替换为
%28
%29
。我对此不满意。我在MSO上报告了URL问题。这是一个Chrome问题(Firefox可以使用这两种URL格式)。我已经向Chrome开发者报告了这个问题。