Regex 记事本中的正则表达式++;替换<;及>;内部CDATA
我正在使用Notepad++修复一个巨大的XML导出文件,这里的挑战之一是将所有Regex 记事本中的正则表达式++;替换<;及>;内部CDATA,regex,xml,notepad++,Regex,Xml,Notepad++,我正在使用Notepad++修复一个巨大的XML导出文件,这里的挑战之一是将所有字符替换为和。问题是,我不能简单地使用replaceall操作,因为XML文件中充满了不能更改的 幸运的是,我需要更改的所有都由CDATA标记包装,如下所示: <![CDATA[Text here... <span class="vSpecial"><p>Special Offer - more text here!</p></span>]]> 特别优惠-
字符替换为
和
。问题是,我不能简单地使用replaceall操作,因为XML文件中充满了不能更改的
都由CDATA标记包装,如下所示:
<![CDATA[Text here... <span class="vSpecial"><p>Special Offer - more text here!</p></span>]]>
特别优惠-此处有更多文字 ]]>
我想知道是否有一个正则表达式来识别CDATA内容中的
,这样我就可以轻松地使用“全部替换”来仅更改它们
更新
CDATA的内容可以包含换行符。Code
*?\K(?:())
替换:(?{1})(?{2})
注意:出于显示目的,上面的链接使用\G(?!\A)
。这在记事本++中不受支持,因此在实际答案中被删除。我将其添加到链接中,以显示其基本功能
有关更多信息,请参阅。它提到以下几点:
对于那些熟悉Perl的读者,不支持\G
结果 之前 之后
解释 反复单击
Replace All
,直到底部的消息显示Replace All:0个匹配项被替换。
它将替换找到的每个CDATA
的第一个匹配项、第二个匹配项、第三个匹配项等
图案
按字面意思匹配
多次匹配任何字符,但尽可能少地确保以下内容不匹配(?:(?!\]\]>)*?
]>
重置报告匹配的起点。任何以前使用的字符将不再包含在最终匹配中\K
匹配以下任一项(?:())
逐字输入捕获组2(
记事本++允许条件替换,因此
(?{1})
引用捕获组1和(?{2})
引用了捕获组2。它工作得很好!非常感谢!只是一个问题,此问题的“全部替换”并不是一次性全部替换。每次单击此选项都只替换一个而不是整个文档。这是与此正则表达式相关还是我遗漏了什么?@AdrianoCastro I答案。记事本++不支持\G
,很遗憾,因此您唯一的选择是反复单击替换所有
,直到您收到我在答案中指定的消息。如果支持\G
,您可以在regex101链接中使用regex(我的答案中代码部分的顶部)然后单击一次以替换每个事件。谢谢!顺便说一句,我想你在更新答案时意外更改了正则表达式。它是(?:)*?\K(?())
,现在是)*?\K(?:())
@AdrianoCastro我在代码部分做了一个注释。我意识到Notepad++不支持\G
,所以我删除了它,这也是为什么你不能简单地做一个“全部替换”的原因。
<!\[CDATA\[)(?:(?!\]\]>).)*?\K(?:(<)|(>))