首页 > 解决方案 > 使用正则表达式从 xml 中删除行

问题描述

我正在处理一个巨大的 xml 文件并且不想使用 XML 软件,因为我从 PubMed 网站导出的 xml 文件的结构不正确,并且会不时更改,所以我想在 notepad++ 或 ultraedit 中删除一些 xml 节点用正则表达式。例如,如何删除这一整行?

<ArticleId IdType="pii">S1806-83242018000100950</ArticleId>

标签: regexxmlnotepad++ultraedit

解决方案


使用Perl 正则表达式搜索字符串:

^[\t ]*<ArticleId IdType="pii">.*</ArticleId>[\t ]*(?:\r?\n|\r|$)

此正则表达式字符串搜索

  • ^... 从一行的开头
  • [\t ]*... 用于 0 个或多个水平制表符或空格(可选的前导制表符/空格)
  • <ArticleId IdType="pii">...这个字符串
  • .*...任何字符0 次或更多次,换行符除外
  • </ArticleId>...这个字符串
  • [\t ]*... 用于 0 个或多个水平制表符或空格(可选的尾随制表符/空格)
  • (?:... )... 内部带有 OR 表达式的非标记组
  • \r?\n|\r|$...回车(可选)和换行或只是回车或行/文件的结尾。

所以(?:\r?\n|\r|$)匹配

  • 回车 + 换行,这是以 DOS/Windows 文本文件结尾的行,
  • 或者只是换行,它是以 UNIX 文本文件结尾的行,
  • 或者只是回车,这是在 MAC OS X 之前以 MAC 文本文件结尾的行。

$不匹配行结束字符。它只是在<ArticleId IdType="pii">.*</ArticleId>文件末尾也发现没有行尾的情况下添加,即文件中的最后一行没有行尾。

也可能是搜索字符串:

[\t ]*<ArticleId IdType="pii">.*</ArticleId>[\t ]*(?:\r?\n|\r)?

现在要删除的 XML 元素也可以在包含另一个标记的行中,因为^删除了行首并且匹配行尾只是可选的。所以它不像上面的搜索表达式那样限制行。


推荐阅读