用 RegEx 查找两个 XML 标记之间的所有内容

RegEx中,我希望找到两个 XML tags之间的标记和所有内容,如下所示:

<primaryAddress>
<addressLine>280 Flinders Mall</addressLine>
<geoCodeGranularity>PROPERTY</geoCodeGranularity>
<latitude>-19.261365</latitude>
<longitude>146.815585</longitude>
<postcode>4810</postcode>
<state>QLD</state>
<suburb>Townsville</suburb>
<type>PHYSICAL</type>
</primaryAddress>

我要找到标签和 primaryAddress之间的一切,然后删除它。

primaryAddress标记之间的所有内容都是一个变量,但是每当我得到 primaryAddress时,我都想删除整个标记和子标记。

有人知道怎么做吗?

206070 次浏览

您应该能够将其与: /<primaryAddress>(.+?)<\/primaryAddress>/进行匹配

标记之间的内容将位于匹配的组中。

在 HTML/XML 解析中使用正则表达式并不是一个好主意..。

但是,如果您想这样做,搜索正则表达式模式

<primaryAddress>[\s\S]*?<\/primaryAddress>

用空字符串代替。

这可以捕获大多数最外层的标记对,即使在侧面或没有结束标记的属性

(<!--((?!-->).)*-->|<\w*((?!\/<).)*\/>|<(?<tag>\w+)[^>]*>(?>[^<]|(?R))*<\/\k<tag>\s*>)

Edit: 正如在上面的注释中提到的,正则表达式总是不足以解析 xml,试图修改正则表达式以适应更多的情况只会使它更长,但仍然是无用的

使用这个方法不太好,但是如果你真的想用正则表达式分割它

<primaryAddress.*>((.|\n)*?)<\/primaryAddress>

经过验证的答案返回标签,但这只返回标签之间的值。

在我们的示例中,我们接收一个 XML 作为 String,并且需要去掉具有一些“特殊”字符的值,如 &<>等。基本上,有人可以以这种形式向我们提供 XML:

<notes>
<note>
<to>jenice & carl </to>
<from>your neighbor <; </from>
</note>
</notes>

所以我需要在这个 String中找到值 jenice & carlyour neighbor <;,并正确地转义 &<(否则,如果您稍后将它传递给一个将重命名为未命名的引擎,那么这个 xml 就是无效的)。

首先,用 regex 做这件事是一个相当愚蠢的想法,但是它很便宜,也很容易。所以那些想和我做同样事情的勇士们,给你们:

    String xml = ...
Pattern p = Pattern.compile("<(.+)>(?!\\R<)(.+)</(\\1)>");
Matcher m = p.matcher(xml);
String result = m.replaceAll(mr -> {
if (mr.group(2).contains("&")) {
return "<" + m.group(1) + ">" + m.group(2) + "+ some change" + "</" + m.group(3) + ">";
}
return "<" + m.group(1) + ">" + mr.group(2) + "</" + m.group(3) + ">";
});