我目前有以下内容:
# 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
变量吗?
感谢您的帮助。
答案 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)