UltraEdit(或 MacOS 正则表达式):删除 xml 中的多行

UltraEdit (or MacOS regex): Delete multiple lines in xml

我有一个未格式化的 xml 文件,我想在其中删除包含某些值的特定名称的标签。

示例:

<XmlElement1>
</XmlElement1>
<XmlElement2 ... >
   ...
   <Xml1SubElement someParameter="...SearchTerm..."/>
   ...
</XmlElement2>
<XmlElement3/>

...代表随机字符和随机多行

在上面的示例中,我想删除正文中包含 "SearchTerm" 的所有 XmlElement2 元素。换句话说,select <XmlElement2</XmlElement2> 之间的所有文本跨多行,其中 SearchTerm 位于中间并替换为“”。

我在 MacOS 上使用 UltraEdit,并且可以灵活选择要使用的工具。

非常感谢您的帮助!

此任务的 Perl 正则表达式搜索字符串可以是例如:

(?s)^[\t ]*<XmlElement2(?:.(?!</XmlElement2>))+?SearchTerm.+?</XmlElement2>[\t ]*(?:\r?\n|\r)

解释:

(?s) ... 标记以匹配搜索表达式中的换行符。

^[\t ]* ... 从行首开始搜索并匹配 0 个或多个制表符或空格。

<XmlElement2 ... 包含 SearchTerm.

的元素的开始标记

(?:.(?!</XmlElement2>))+? ...一个非标记组,只要当前字符之后的字符串不是</XmlElement2>,就可以非贪婪地找到任何字符一次或多次。否定前瞻 (?!</XmlElement2>) 阻止选择以 <XmlElement2 开头的块并匹配任何内容,包括一个或多个 </XmlElement2><XmlElement2 标记,直到在文件中的任何位置找到 SearchTerm .

SearchTerm ... 必须在元素 XmlElement2.

中找到的字符串

.+? ...任意字符(包括换行符)一次或多次非贪婪。非贪婪意味着在下一次出现 </XmlElement2> 时停止匹配字符,而不是在文件中最后一次出现 </XmlElement2> 时停止匹配字符。

</XmlElement2> ... 包含 SearchTerm.

时要删除的 XML 元素的结束标记

[\t ]*(?:\r?\n|\r) ... 0 个或多个制表符或空格以及 DOS/Windows(回车 return + 换行符)或 UNIX(仅换行符)或 MAC(只是回车return)行结束。

PS:Perl 正则表达式替换已通过 UltraEdit 测试 Windows v22.20.0.49 on Windows XP 和 v25.20.0.88 on Windows 7 因为我没有 Mac.