我正在使用Notepad ++修复一个巨大的XML导出文件,其中一个挑战是将所有<
和>
字符替换为<
和>
。问题是,我不能简单地使用替换所有操作,因为XML文件已满了&lt;和&gt;无法改变的。
幸运的是,我需要更改的所有<
和>
都包含在CDATA标记中,如下所示:
<![CDATA[Text here... <span class="vSpecial"><p>Special Offer - more text here!</p></span>]]>
我想知道是否有正则表达式来识别CDATA内容中包含的<
和>
,因此我可以轻松地使用全部替换来更改它们。
更新
CDATA的内容可以包含换行符。
答案 0 :(得分:2)
<!\[CDATA\[)(?:(?!\]\]>).)*?\K(?:(<)|(>))
替换:(?{1}<)(?{2}>)
注意:出于显示目的,上面的链接使用\G(?!\A)
。 Notepad ++不支持此功能,因此它已在实际答案中删除。我将它添加到链接中以显示它基本上做了什么。
有关详细信息,请参阅Notepadd++ documentation。它提到了以下内容:
对于熟悉Perl的读者,不支持
\G
。
重复点击Replace All
,直到底部的消息显示Replace All: 0 occurrences were replaced.
它将替换第一个匹配项,然后是第二个匹配项,然后是第三个,等等于找到的每个CDATA
没有比赛了。
<!\[CDATA\[
按字面意思匹配<![[CDATA[
(?:(?!\]\]>).)*?
任意次数匹配任何字符的驯服懒惰令牌,但尽可能少确保以下内容不匹配]]>
\K
重置报告的匹配的起点。最终匹配中不再包含任何以前消费的字符(?:(<)|(>))
匹配以下任一项
(<)
将<
字面上捕获到捕获组1 (>)
将>
字面上捕获到捕获组2 Notepad ++允许条件替换,因此(?{1}<)
引用捕获组1,(?{2}>)
引用捕获组2。