2013-03-22 78 views
1

在下面的用例中查找基于正则表达式的Java替换字符串。 我正在做一些基于Groovy的XML处理,并且由于一些自定义处理(在这方面不会有太多细节),所产生的XML有一些无效标记,例如,Java基于正则表达式的字符串替换

<?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只是作为一个字符串来处理,所以我想要做的就是,通过基于字符串正则表达式的替换来替换这种结束标记的出现。对于例如替换

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

任何想法,如果有快速的Java基于字符串的正则表达式我可以用来做这种替换吗?

谢谢。

+0

当您加载javadoc中会发生什么,按Ctrl-F,并键入 “正则表达式”?为什么不修复产生垃圾的错误“自定义处理”,而不是试图解决问题? – 2013-03-22 23:51:31

回答

5

尝试

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

太棒了!这是完美的。非常感谢。 – codehammer 2013-03-23 00:24:35

+0

+1,但我会使用'] +)[^>] +>'。 '。*?'是一个善变的朋友;当你能够如此轻易地说出你想要的东西时,为什么要放下自己的怜悯呢? – 2013-03-23 05:00:49

+0

我同意\\ s,但它似乎正则表达式转换为“” - >“” – 2013-03-23 05:27:40

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. 
+0

谢谢Vivin!这在一定程度上起作用。唯一的问题是,它甚至取代了开始和结束尖括号。换句话说,它会导致客户而不是 codehammer 2013-03-23 00:06:38

+0

正如[Evgeniy的回答](http://stackoverflow.com/a/15581822/20938)所示,此解决方案比需要更详细。特别是,在替换之前不需要调用find()。 'replaceAll()'本身就是这样做的,如果没有匹配,它就会返回原来的字符串。您不需要为替换字符串调用像“group(n)”这样的方法。如果字符串中出现任何问号或反斜杠,您将得到一个运行时异常;如果你使用'“$ 1”',这不是问题。 – 2013-03-23 05:18:40

+0

是的,他的答案好多了。 – 2013-03-23 06:26:25