我在perl正则表达式替换方面有相当的能力,但我有点生疏,这是我不常做的事情。逃避& amp; XML的字符,但阻止替换已转义字符中的&。它似乎工作正常,除了它删除或替换它右侧的字符。我错过了什么?
$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g;
答案 0 :(得分:5)
你误认为negative look-ahead的否定字符类。
你的正则表达式真的意味着:
/&[^#39aglmopqtu;|]/ # mixed a few letters and removed duplicates
但你意味着:
/&(?!amp;|lt;|gt;|quot;|#39;)/
方形括号表示字符类,而不是分组!
如果你真的想避免匹配XML实体,你应该使用像
这样的正则表达式m{& (?! (?:
(?:\#[0-9]+)
|(?:\#x[0-9a-fA-F]+)
|(?:[lg]t|amp|apos|quot) # predefined XML entities
); )}x
(比较XML spec)并以某种方式添加文档声明的所有实体或引用的DTD。
答案 1 :(得分:2)
您似乎需要零宽度负面预测。像
这样的东西$str =~ s/&(?!amp;|lt;|gt;|quot;|#39;)/&/g;