2013-09-23 42 views
0

我已经有一个程序读取行并更改其中的一部分,只要前面没有反斜杠即可。Perl只改变匹配正则表达式的一部分

例如,如果单词foo的打算改为吧,森泰斯

Hello foo, thisfoo likes \foo 

将成为

Hello bar, thisbar likes \foo 

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

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

但当然这会导致输出为

Hellobar, thibar likes \foo 

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

感谢

回答

2

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

您可以使用一个负回顾后:

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

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

同时,我想指出的是,你可能会认为它的工作原理当前的正则表达式不起作用:

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

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