0

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

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

Hello foo, thisfoo likes \foo

会成为

Hello bar, thisbar likes \foo

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

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

但当然这会导致输出

Hellobar, thibar likes \foo

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

谢谢

4

1 回答 1

2

您可以使用的解决方法是环顾四周:)

您可以使用否定的lookbehind:

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

这将匹配foo,除非它前面有一个反斜杠。

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

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

[(^\\)]应该匹配任何(, ), ^, 或\. 你的意思可能是[^\\]

于 2013-09-23T10:12:49.743 回答