任何人都可以解释正则表达式在正则表达式保存在变量中时的正则表达式文本替换吗?我正在尝试处理一些文本,实际上是Clearcase配置规范,并在我去的时候替换文本。替换的规则保存在一个哈希数组中,这些哈希有正则表达式匹配和要替换的文本。Perl正则表达式变量和匹配模式替换
输入文字看起来财产以后这样的:
element /my_elem/releases/... VERSION_STRING.020 -nocheckout
大部分取代均简单地删除包含特定文本串线,这工作正常。在某些情况下,我想替换文本,但重新使用VERSION_STRING文本。我试过在替换表达式中使用$ 1,但它不起作用。 $ 1在匹配中获取版本字符串,但$ 1的替换在替换中不起作用。
在这些情况下,输出应该是这个样子:
element -directory /my_elem/releases/... VERSION_STRING.020 -nocheckout
element /my_elem/releases/.../*.[ch] VERSION_STRING.020 -nocheckout
即。一行输入成为两个输出,并且版本字符串已被重新使用。
代码看起来像这样。第一正则表达式和替换:
my @Special_Regex = (
{ regex => "\\s*element\\s*\/my_elem_removed\\s*\/main\/\\d+\$", subs => "# Line removed" },
{ regex => "\\s*element\\s*\/my_elem_changed\/releases\/\.\.\.\\s*\(\.\*\$\)",
subs => "element \-directory \/my_elem\/releases\/\.\.\. \\1\nelement \/my_elem\/releases\/\.\.\.\/\*\.\[ch\] \\1" }
);
在第二正则表达式的变量$ 1中的部分被定义并且该工作正常(* \ $。)。然而,subs表达式不会替代它。
foreach my $line (<INFILE>)
{
chomp($line);
my $test = $line;
foreach my $hash (@Special_Regex)
{
my $regex = qr/$hash->{regex}/is;
if($test =~ s/$regex/$hash->{subs}/)
{
print "$test\n";
print "$line\n";
print "$1\n";
}
}
}
我错过了什么?提前致谢。
不要使用ddoouubbllee slackbashed字符串的正则表达式,然后编译它所有的时间。只需直接创建散列值'qr //'字符串即可。不要在替换的RHS上使用'\\ 1'!请摆脱那些丑陋的LTS字符串。 – tchrist 2010-11-03 17:07:26
我相信有人会愿意阅读这篇文章。与此同时,请自己和任何必须阅读的人编写代码并在'perldoc perlreref'中查找'\ Q'。 – 2010-11-03 17:08:36
公平评论。这段代码在我一直在尝试的过程中经过了几次修改 - 我删除了qr以控制什么是逃脱和什么不是。除了$ 1 \ 1替换之外,您可以相信我的正则表达式正常工作。 – 0xDEADBEEF 2010-11-03 17:09:10