循环使用正则表达式并替换找到的实例

时间:2014-09-25 10:13:28

标签: regex perl

我目前有以下内容:

# Pre-append "$" to variable names.
# ['"](?:[^'"]*?(?:\\")*)*["'] Matches strings within double or single quotes.
# (*SKIP)(*F) Causes the preceding pattern to fail. Tries to match the pattern on the right side of the | operator using the remaining strings.

my $temp = $entire_line;    
while ($temp =~ /['"](?:[^'"]*?(?:\\")*)*["'](*SKIP)(*F)|([A-Za-z0-9_]+)/g){
    my $variable_name = $1;     
    $entire_line =~ s/$variable_name/\$$variable_name/;     
}

给定$entire_line = ((factor0 + factor1) * factor2) + factor0

我希望我的输出为:

(($factor0 + $factor1) * $factor2) + $factor0

但是,我得到了:

(($$factor0 + $factor1) * $factor2) + factor0

我知道这种情况正在发生,因为它发现了factor0的第一个实例两次。有没有一种好方法可以防止这种情况发生并替换正在找到的实例?

我还需要使用$temp变量吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

长正则表达式没有找到第一个factor0两次。这是替换中的简单正则表达式。为了使其发挥作用,您需要确保找不到以$开头的那些。

    $entire_line =~ s/([^\$])$variable_name/$1\$$variable_name/;     

您可以将$entire_line与该解决方案一起使用并删除$temp,但这一般非常令人困惑。如果这是生产代码,我建议您使用/x标志向代码和正则表达式添加注释。 Your future self will thank you later


在此处检查您的正则表达式:http://regex101.com/r/vX0aJ9/1

答案 1 :(得分:2)

(\w+)

将此替换为$$1

见dmeo。

http://regex101.com/r/qC9cH4/17