Notepad ++中的正则表达式替换<和>在CDATA里面

时间:2017-12-19 16:56:53

标签: regex xml notepad++

我正在使用Notepad ++修复一个巨大的XML导出文件,其中一个挑战是将所有<>字符替换为&lt;&gt;。问题是,我不能简单地使用替换所有操作,因为XML文件已满了&lt;和&gt;无法改变的。

幸运的是,我需要更改的所有<>都包含在CDATA标记中,如下所示:

<![CDATA[Text here... <span class="vSpecial"><p>Special Offer - more text here!</p></span>]]>

我想知道是否有正则表达式来识别CDATA内容中包含的<>,因此我可以轻松地使用全部替换来更改它们。

更新

CDATA的内容可以包含换行符。

1 个答案:

答案 0 :(得分:2)

代码

See regex in use here

<!\[CDATA\[)(?:(?!\]\]>).)*?\K(?:(<)|(>))

替换:(?{1}&lt;)(?{2}&gt;)

注意:出于显示目的,上面的链接使用\G(?!\A)。 Notepad ++不支持此功能,因此它已在实际答案中删除。我将它添加到链接中以显示它基本上做了什么。

有关详细信息,请参阅Notepadd++ documentation。它提到了以下内容:

  

对于熟悉Perl的读者,不支持\G

结果

之前

Before

After

说明

重复点击Replace All,直到底部的消息显示Replace All: 0 occurrences were replaced.它将替换第一个匹配项,然后是第二个匹配项,然后是第三个,等等于找到的每个CDATA没有比赛了。

模式

  • <!\[CDATA\[按字面意思匹配<![[CDATA[
  • (?:(?!\]\]>).)*?任意次数匹配任何字符的驯服懒惰令牌,但尽可能少确保以下内容不匹配]]>
  • \K重置报告的匹配的起点。最终匹配中不再包含任何以前消费的字符
  • (?:(<)|(>))匹配以下任一项
    • (<)<字面上捕获到捕获组1
    • (>)>字面上捕获到捕获组2

替换

Notepad ++允许条件替换,因此(?{1}&lt;)引用捕获组1,(?{2}&gt;)引用捕获组2。