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

时间:2012-11-05 22:44:33

标签: java php regex xml perl

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时删除整个标记和子标记。

任何人都知道如何做到这一点?

5 个答案:

答案 0 :(得分:98)

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

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

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

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

答案 1 :(得分:15)

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

匹配

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

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:1)

使用此方法不好,但是如果您真的想用正则表达式拆分它

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

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

答案 4 :(得分:0)

在我们的例子中,我们以String的形式接收XML,并且需要删除具有某些“特殊”字符的值,例如&<>等。基本上,有人可以向我们提供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) + ">";
    });