特定 XML 元素的正则表达式

Posted

技术标签:

【中文标题】特定 XML 元素的正则表达式【英文标题】:Regex for specific XML Elements 【发布时间】:2018-11-24 22:26:54 【问题描述】:

在我的 C# 应用程序中,我试图通过使用正则表达式过滤掉我的一些 XML 元素。

我的输入例如:

<myXMLTag id="Text1.Text2.Text3">
   <Anything/>
</myXMLTag>
<myXMLTag  id="Text1.ISHOULDNOTBEHERE.Text3">
   <Anything/>
</myXMLTag>
<myXMLTag  id="Text1.Text2.Text3">
    <Anything/>
</myXMLTag>

我在http://regexstorm.net/tester 上尝试了一些正则表达式,但它总是标记前两个&lt;myXMLTag&gt;,而不仅仅是中间那个。

图案:

<myXMLTag.*Text1.+(ISHOULDNOTBEHERE)+.*?</(myXMLTag)>

我需要一个模式,它只能在 XML 字符串中找到 XML 元素,看起来像中间那个。

【问题讨论】:

那么你是想全部匹配还是只匹配中间那个 我只是想让正则表达式匹配中间那个。 XY problem。永远不要使用 Regex 进行 XML 解析/操作。使用您选择的 XML 库中的 XML 函数。 您真的需要为相关搜索关键字添加一个 + 量词吗? @UweKeim 那不是问题。感谢您重复我在我的问题中所说的内容,但评论没有一点帮助。 【参考方案1】:

使用正则表达式解析 XML 绝对不是一个好主意。像这样的插条只有很小的空间。

也就是说,试试这样:

<(myXMLTag)\s+id="[^"]+(ISHOULDNOTBEHERE)(?:(?!</\1>).)+</\1>

Demo

说明

&lt;(myXMLTag)\s+id=" 作为起始锚点 [^"]+ 否定范围匹配除" 之外的所有内容 ISHOULDNOTBEHERE 显然是你的关键字 (?!&lt;/\1&gt;).)+ tempered greedy token 使用反向引用匹配除了结束标签之外的所有内容 &lt;/\1&gt; 结束标签,再次使用反向引用

【讨论】:

你能提供一个正则表达式来反过来吗?我在哪里只能找到不包含“ISHOULDNOTBEHERE”关键字的 XML 元素? :D【参考方案2】:

对有关使用正则表达式解析 XML 的问题的标准回答是

RegEx match open tags except Xhtml self-contained tags

这个答案可能看起来有点过头,但它是有道理的:我们大多数人都已经看到如果你尝试这样做可能会出现灾难性的结果。基本上,任何尝试使用正则表达式处理 XML 的程序都会很慢而且有问题。如果您想快速获得结果并且不介意错误,那么请继续 - 并确保您不会在项目中停留足够长的时间来承担后果。

使用 XML 解析器,它是适合这项工作的工具。

【讨论】:

这正是重点。实现这一点的软件将在接下来的几个月内被删除,并建立在使用正则表达式和 XML 的基础上。我们都知道这很糟糕,但有时你必须做一些你知道是错误的事情。但是它背后的功能仍然需要作为一种快速而肮脏的方式。我也不太高兴:D【参考方案3】:

这有点难看,但只要您尊重示例中的模式,它应该可以工作:

.+ISHOULDNOTBEHERE.+\n.+\n<\/myXMLTag>

在这里测试regex101

开始一行,匹配 1 个或多个任意字符 (.+) 识别文字 ISHOULDNOTBEHERE 在 \n (.+\n) 之前使用任何字符 在下一行使用 1 个或多个任意字符,该行跳转到下一行 (.+\n) 识别文字

【讨论】:

顺便说一句,OP 告诉我您是否需要解释或者它是自我解释。 没关系,我会读正则表达式。我会试试这个。 @Jorge.V - 请给我一个解释。 我无法让它正常工作:(我什至不能告诉你为什么。另一个答案是开箱即用的。但感谢你的努力。

以上是关于特定 XML 元素的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 包含在 XML 元素中

在 Python 中使用正则表达式从特定 xml 标记中提取特定值 [重复]

更改具有与特定正则表达式模式匹配的标记的 xml 树中的值

从 xml 字符串获取结果集元素的正则表达式是啥? [复制]

使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点

删除元素的正则表达式与特定前缀不匹配