我正在使用Notepad ++修复一个巨大的XML导出文件,其中一个挑战是将所有<
和>
字符替换为<
和>
。问题是,我不能简单地使用替换所有操作,因为XML文件中充满了无法更改的<和>。
幸运的是,我需要更改的所有<
和>
都被CDATA标签包裹,如下所示:
<![CDATA[Text here... <span class="vSpecial"><p>Special Offer - more text here!</p></span>]]>
我想知道是否有正则表达式来识别包含在CDATA内容中的<
和>
,因此我可以轻松地使用全部替换来仅更改它们。
UPDATE
CDATA的内容可以包含换行符。
<!\[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。