2013-09-23 81 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; 

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