Java:String.replace(regex,string)从XML中删除内容

时间:2011-06-27 14:26:16

标签: java xml regex

假设我有一个字符串形式的XML。我希望删除XML String中两个标记之间的内容。我试过了:

String newString = oldString.replaceFirst("\\<tagName>.*?\\<//tagName>",
                                                              "Content Removed");

但它不起作用。关于我做错了什么的任何指示?

3 个答案:

答案 0 :(得分:7)

好的,除了明显的答案(don't parse XML with regex)之外,也许我们可以解决这个问题:

String newString = oldString.replaceFirst("(?s)<tagName[^>]*>.*?</tagName>",
                                          "Content Removed");

说明:

(?s)             # turn single-line mode on (otherwise '.' won't match '\n')
<tagName         # remove unnecessary (and perhaps erroneous) escapes
[^>]*            # allow optional attributes
>.*?</tagName>   

您确定正确匹配标签案例吗?也许您还想在模式中添加i标志:(?si)

答案 1 :(得分:0)

可能问题出在这里:

<//tagName>

尝试将其更改为

<\/tagName>

答案 2 :(得分:0)

XML是一种语法;正则表达式不是使用语法的最佳工具。

我的建议是使用真正的解析器来处理DOM而不是匹配

例如,如果你有:

<xml>
 <items>
  <myItem>
     <tagtoRemove>something1</tagToRemove>
  </myItem>
  <myItem>
     <tagtoRemove>something2</tagToRemove>
  </myItem>
 </items>

正则表达式可能会尝试匹配它(由于贪婪的机制)

<xml>
 <items>
  <myItem>
     matchString
  </myItem>
 </items>

此外,一些DTD可能允许的一些用法(例如<tagToRemove/><tagToRemove attr="value">)使得使用正则表达式捕获标记更加困难。

除非您非常清楚上述任何一种情况都不会发生(也不会或将来),我会选择解析器。