Perl正则表达式替换替换1个太多字符

时间:2013-01-04 22:33:10

标签: regex perl substitution

我在perl正则表达式替换方面有相当的能力,但我有点生疏,这是我不常做的事情。逃避& amp; XML的字符,但阻止替换已转义字符中的&。它似乎工作正常,除了它删除或替换它右侧的字符。我错过了什么?

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

2 个答案:

答案 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;