我在 perl 正则表达式替换方面相当有能力,但我有点生疏了,这是我通常不做的事情。这是为 XML 转义一个 & 字符,但防止在已经转义的字符中替换 &。它似乎工作正常,只是它删除或替换了它右侧的字符。我错过了什么?
$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g;
我在 perl 正则表达式替换方面相当有能力,但我有点生疏了,这是我通常不做的事情。这是为 XML 转义一个 & 字符,但防止在已经转义的字符中替换 &。它似乎工作正常,只是它删除或替换了它右侧的字符。我错过了什么?
$str =~ s/&[^amp;|lt;|gt;|quot;|#39;]/&/g;
您将否定字符类误认为是否定前瞻。
你的正则表达式真的意味着:
/&[^#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 规范)并以某种方式添加您的文档或引用的 DTD 声明的所有实体。
看来您需要零宽度的负前瞻。就像是
$str =~ s/&(?!amp;|lt;|gt;|quot;|#39;)/&/g;