假设我有一个字符串形式的XML。我希望删除XML String中两个标记之间的内容。我试过了:
String newString = oldString.replaceFirst("\\<tagName>.*?\\<//tagName>",
"Content Removed");
但它不起作用。关于我做错了什么的任何指示?
答案 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">
)使得使用正则表达式捕获标记更加困难。
除非您非常清楚上述任何一种情况都不会发生(也不会或将来),我会选择解析器。