【发布时间】:2020-05-20 21:32:22
【问题描述】:
我有一些字符串,我需要在其中找到变量以便用值替换它们。例如:
my $str = "var1 var2 blah blah blah var3"
有时字符串会嵌入字符串:
my $str = "var1 var2 blah \"do not replace this: var1\" blah blah var3"
所以我构建了一个匹配字符串和变量的正则表达式。当它匹配一个字符串时,它会用自己替换它。当它匹配变量时,它用散列的结果替换它们。为了使这项工作以正则表达式的形式工作,我将捕获分成两部分,命名组(宏)和最后一个匹配。对于字符串,我将第一个引号字符 (") 捕获到命名组中,并将字符串的其余部分捕获到最后一个匹配项中。对于变量,我捕获命名组中的整个变量,而我在最后一个捕获组中不捕获任何内容。要处理字符串,我为 {"} = '"' 添加了一个哈希条目。对于每个匹配项,我粘贴哈希查找,然后是最后一个匹配项。这执行得非常好 - 虽然看起来很尴尬。
$line =~ s/(?:(?<macro>(?<!\\)")(.*?(?<!\\)")|(?<macro>(``|\b($list_of_hash_keys)\b))())/$variables->{$+{macro}}$+/gs;
在漂亮的正则表达式中是否有更简洁的方式?
【问题讨论】:
-
改为查看 Text::Balanced。
-
你的预期输出是什么???