在Notepad ++中使用正则表达式来替换CDATA中的<和>

问题描述 投票:1回答:1

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

幸运的是,我需要更改的所有<>都被CDATA标签包裹,如下所示:

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

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

UPDATE

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

regex xml notepad++
1个回答
2
投票

See regex in use here

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

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

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

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

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


结果

Before

Before

After

After


说明

重复单击Replace All,直到底部的消息显示Replace All: 0 occurrences were replaced.它将替换第一次出现,然后是第二次出现,然后是第三次,等等,直到没有更多匹配时找到的每个CDATA

Pattern

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

Replacement

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

© www.soinside.com 2019 - 2024. All rights reserved.