2013-01-04 123 views
1

我在perl正則表達式替換中有相當的能力,但是我有些生疏,這是我通常不會做的。這是爲了避免XML的&字符,但是防止在已經轉義的字符中替換&。它似乎工作正常,除了刪除或替換右側的字符。我錯過了什麼?Perl正則表達式替換替換1太多字符

$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g; 

回答

6

您誤將否定字符類negative look-ahead

你的正則表達式的真正含義是:

/&[^#39aglmopqtu;|]/ # mixed a few letters and removed duplicates 

但你意味着

/&(?!amp;|lt;|gt;|quot;|#39;)/ 

方bracktes表示字符類,不分組!

如果你真的想避免匹配XML實體,你倒是應該使用正則表達式像

m{& (?! (?: 
    (?:\#[0-9]+) 
    |(?:\#x[0-9a-fA-F]+) 
    |(?:[lg]t|amp|apos|quot) # predefined XML entities 
);)}x 

(比較XML spec)並以某種方式加入由您的文檔,或引用DTD聲明的所有實體。

+0

嗯...我有一些趕上做!這兩個解決方案都可行感謝大家! – ThorInSuburbia

2

看來您需要零寬度負向預測。像

$str =~ s/&(?!amp;|lt;|gt;|quot;|#39;)/&/g; 
+0

非常好!謝謝! – ThorInSuburbia