基于Java Regex的字符串替换

时间:2013-03-22 23:44:59

标签: java xml regex groovy

在以下用例中寻找基于正则表达式的Java替换。 我正在做一些基于Groovy的XML处理,并且由于一些自定义处理(在这方面不会详细说明),结果XML有一些无效的标签,例如,

<?xml version='1.0' encoding='UTF-8'?>
<Customer id="xyz" xmlns='http://abc.com'>
<order orderGroup="mock">
    <entry>
        <key>test</key>
    </entry>
</order orderGroup="mock">
</Customer id="xyz">

如果您注意到,包含属性的元素名称的结束标记会混乱。 XML只是被视为一个字符串,所以我想做的是,只需通过基于字符串regex的替换来替换此类结束标记的出现。对于例如替换

</order orderGroup="mock"> with </order>, 
</Customer id="xyz"> with </Customer>

任何想法是否有快速的基于Java String的正则表达式我可以用来做这样的替换?

感谢。

2 个答案:

答案 0 :(得分:5)

    xml = xml.replaceAll("</([^ >]+).*?>", "</$1>");

答案 1 :(得分:2)

最简单的解决方案是修复自定义XML处理并生成有效 XML。

简单的解决方案是使用JTidy之类的东西来清理XML。

如果你必须使用正则表达式,你可以尝试这样的事情:

Pattern pattern = Pattern.compile("</([A-Za-z]+) [^>]+>");
Matcher matcher = pattern.matcher(xml);

if(matcher.find()) {
   xml = matcher.replaceAll(matcher.group(1));
}

我没有对此进行过测试,请记住这一点。可能存在一些问题。

正则表达式的解释:

<         -> The opening angle bracket of the tag
/         -> The / that marks a closing tag
(         -> Start of a capturing group. We want to capture the actual ending tag.
[A-Za-z]+ -> One or more alphabetic characters (upper and lowercase)
)         -> End of the capturing group.
          -> A space.
[^>]+     -> One or more of anything that is not a closing angle-bracket.
>         -> The closing angle bracket of the tag.