74

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.

有人知道该怎么做吗?

4

5 回答 5

141

使用正则表达式进行 HTML/XML 解析不是一个好主意...

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

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

并将其替换为空字符串...

于 2012-11-05T22:48:55.640 回答
20

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

标签之间的内容将在匹配的组中。

于 2012-11-05T22:48:07.543 回答
17

使用这种方法不好,但如果你真的想用正则表达式拆分它

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

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

于 2018-11-15T12:03:22.353 回答
6

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

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

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

于 2014-10-25T16:04:36.757 回答
0

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

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

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

用正则表达式做这件事一开始是一个相当愚蠢的想法,但它既便宜又容易。所以那些想做和我一样的勇敢的人,给你:

    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) + ">";
    });
于 2020-10-24T18:24:27.900 回答