Perl仅更改匹配的正则表达式的一部分

时间:2013-09-23 10:10:52

标签: regex perl

我有一个程序可以读取行并改变它们的一部分,只要它前面没有反斜杠。

例如,如果将单词foo更改为bar,则为sentance

Hello foo, thisfoo likes \foo

会变成

Hello bar, thisbar likes \foo

如果该行存储在$ line中,我的代码是

$line =~ s/[(^\\)]foo/bar/g;

但当然会产生

的输出
Hellobar, thibar likes \foo

有没有办法让正则表达式搜索找到字符串的一些要求,但不包括在被改变的内容中?或者是否有某种解决方法。我唯一能想到的是将\foo的所有出现替换为其他字符串,然后再将其替换回来,但这绝对不理想,因为我无法保证输入中的内容。

由于

1 个答案:

答案 0 :(得分:2)

您可以使用的解决方法是一个环视:)

你可以使用负面的后视:

$line =~ s/(?<!\\)foo/bar/g;

这将匹配foo,除非它之前有反斜杠。

此外,我想指出您当前的正则表达式不起作用,因为您可能认为它有效:

$line =~ s/[(^\\)]foo/bar/g;

[(^\\)]应匹配()^\中的任何一个。您的意思是[^\\]