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("问题可能出在这里:
<//tagName>
试试改成
<\/tagName>
【讨论】:
在 Java 中,</tagName>
不会有任何转义。
@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 可能允许的某些用途(例如 <tagToRemove/>
或 <tagToRemove attr="value">
)使得使用正则表达式捕获标签更加困难。
除非您非常清楚以上都不会发生(也不会发生或将来发生),否则我会使用解析器。
【讨论】:
以上是关于Java:String.replace(regex, string) 从 XML 中删除内容的主要内容,如果未能解决你的问题,请参考以下文章
JAVA中string.replace和string.replaceAll的区别及用法
Remove/Replace-href/anchor/link-in html/string-pregu Replace-php-regex-regular表达式
JavaScript 正则表达式 string.replace( regex, "$1" );中“$1”的含义 及邮箱正则表达式