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

Posted

技术标签:

【中文标题】Java:String.replace(regex, string) 从 XML 中删除内容【英文标题】:Java: String.replace(regex, string) to remove content from XML 【发布时间】:2011-09-23 13:52:09 【问题描述】:

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

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

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

【问题讨论】:

如果除了最简单的非嵌套 xml 之外还有其他任何东西,那么正则表达式将无法正常工作。 【参考方案1】:

好的,除了显而易见的答案(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)

【讨论】:

最后,简单地使用 string.replaceFirst(".*", "Content Removed");工作得很好,我不知道为什么我把它弄得这么复杂。感谢您解释 Java 中的正则表达式属性,非常有帮助!【参考方案2】:

问题可能出在这里:

&lt;//tagName&gt;

试试改成

&lt;\/tagName&gt;

【讨论】:

在 Java 中,&lt;/tagName&gt; 不会有任何转义。 @Pable 是的,但它不使用 Java 正则表达式引擎,它是 flex / flash @Pable 不,它有效,只是没有必要:“反斜杠可以在非字母字符之前使用,无论该字符是否是未转义结构的一部分。” (source) 好吧,所以没有伤害。感谢您的信息(顺便说一句,这是 Pablo 不是 Pable :)) @Pablo Grrr,同样的错字两次。我一直都知道是巴勃罗,但不知怎的,我的手指不同意。对不起!!!【参考方案3】:

XML 是一种语法;正则表达式并不是处理语法的最佳工具。

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

例如,如果您有:

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

正则表达式可以尝试匹配它(由于贪心机制)

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

此外,某些 DTD 可能允许的某些用途(例如 &lt;tagToRemove/&gt;&lt;tagToRemove attr="value"&gt;)使得使用正则表达式捕获标签更加困难。

除非您非常清楚以上都不会发生(也不会发生或将来发生),否则我会使用解析器。

【讨论】:

以上是关于Java:String.replace(regex, string) 从 XML 中删除内容的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中string.replace和string.replaceAll的区别及用法

Remove/Replace-href/anchor/link-in html/string-pregu Replace-php-regex-regular表达式

如何使用string.replace替换

JavaScript 正则表达式 string.replace( regex, "$1" );中“$1”的含义 及邮箱正则表达式

C#Regex使用匹配值替换

kotlin String :: replace删除转义序列?