2011-06-27 70 views
1

可以說我有一個字符串形式的XML。我希望刪除XML字符串中兩個標籤之間的內容。我曾嘗試過:Java:String.replace(regex,string)從XML中刪除內容

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

但它不起作用。任何指針,我在做什麼錯?

+1

如果除了最簡單的非嵌套xml之外,其他任何東西都不會起作用。 –

回答

6

OK,除了顯而易見的答案(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)

+0

最後,只需使用string.replaceFirst(「。*」, 「Content Removed」);工作得很好,我不知道爲什麼我讓它變得如此複雜。感謝您解釋Java中的正則表達式屬性,但非常有幫助! – TookTheRook

0

也許問題就出在這裏:

<//tagName>

嘗試將其更改爲

<\/tagName>

+0

在Java中,''會很好地完成,沒有任何逃脫。 –

+0

我在這裏試過了,它的工作原理是轉義'/'char http://gskinner.com/RegExr/ –

+0

@Pable是的,但是它沒有使用Java Regex引擎,它是flex/flash –

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">)使與正則表達式莫醒目標籤很難。

除非你很清楚上述情況不會發生(也不在將來),否則我會使用解析器。