我在perl正則表達式替換中有相當的能力,但是我有些生疏,這是我通常不會做的。這是爲了避免XML的&字符,但是防止在已經轉義的字符中替換&。它似乎工作正常,除了刪除或替換右側的字符。我錯過了什麼?Perl正則表達式替換替換1太多字符
$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g;
我在perl正則表達式替換中有相當的能力,但是我有些生疏,這是我通常不會做的。這是爲了避免XML的&字符,但是防止在已經轉義的字符中替換&。它似乎工作正常,除了刪除或替換右側的字符。我錯過了什麼?Perl正則表達式替換替換1太多字符
$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g;
您誤將否定字符類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聲明的所有實體。
嗯...我有一些趕上做!這兩個解決方案都可行感謝大家! – ThorInSuburbia