2013-03-22 127 views
1

在下面的用例中查找基於正則表達式的Java替換字符串。 我正在做一些基於Groovy的XML處理,並且由於一些自定義處理(在這方面不會有太多細節),所產生的XML有一些無效標記,例如,Java基於正則表達式的字符串替換

<?xml version='1.0' encoding='UTF-8'?> 
<Customer id="xyz" xmlns='http://abc.com'> 
<order orderGroup="mock"> 
    <entry> 
     <key>test</key> 
    </entry> 
</order orderGroup="mock"> 
</Customer id="xyz"> 

如果您注意,包含屬性的元素名稱的結束標記會混淆。 XML只是作爲一個字符串來處理,所以我想要做的就是,通過基於字符串正則表達式的替換來替換這種結束標記的出現。對於例如替換

</order orderGroup="mock"> with </order>, 
</Customer id="xyz"> with </Customer> 

任何想法,如果有快速的Java基於字符串的正則表達式我可以用來做這種替換嗎?

謝謝。

+0

當您加載javadoc中會發生什麼,按Ctrl-F,並鍵入 「正則表達式」?爲什麼不修復產生垃圾的錯誤「自定義處理」,而不是試圖解決問題? – 2013-03-22 23:51:31

回答

5

嘗試

xml = xml.replaceAll("</([^ >]+).*?>", "</$1>"); 
+0

太棒了!這是完美的。非常感謝。 – codehammer 2013-03-23 00:24:35

+0

+1,但我會使用'] +)[^>] +>'。 '。*?'是一個善變的朋友;當你能夠如此輕易地說出你想要的東西時,爲什麼要放下自己的憐憫呢? – 2013-03-23 05:00:49

+0

我同意\\ s,但它似乎正則表達式轉換爲「」 - >「」 – 2013-03-23 05:27:40

2

最簡單的解決方案是修復您的自定義XML處理並使其生成有效的 XML。

簡單的解決方案是使用類似JTidy的東西來清理你的XML。

如果必須使用正則表達式,你可以嘗試這樣的事:

Pattern pattern = Pattern.compile("</([A-Za-z]+) [^>]+>"); 
Matcher matcher = pattern.matcher(xml); 

if(matcher.find()) { 
    xml = matcher.replaceAll(matcher.group(1)); 
} 

我沒有測試過這一點,所以記住這一點。可能有幾個問題。

正則表達式的說明:

<   -> The opening angle bracket of the tag 
/  -> The/that marks a closing tag 
(  -> Start of a capturing group. We want to capture the actual ending tag. 
[A-Za-z]+ -> One or more alphabetic characters (upper and lowercase) 
)   -> End of the capturing group. 
      -> A space. 
[^>]+  -> One or more of anything that is not a closing angle-bracket. 
>   -> The closing angle bracket of the tag. 
+0

謝謝Vivin!這在一定程度上起作用。唯一的問題是,它甚至取代了開始和結束尖括號。換句話說,它會導致客戶而不是 codehammer 2013-03-23 00:06:38

+0

正如[Evgeniy的回答](http://stackoverflow.com/a/15581822/20938)所示,此解決方案比需要更詳細。特別是,在替換之前不需要調用find()。 'replaceAll()'本身就是這樣做的,如果沒有匹配,它就會返回原來的字符串。您不需要爲替換字符串調用像「group(n)」這樣的方法。如果字符串中出現任何問號或反斜槓,您將得到一個運行時異常;如果你使用'「$ 1」',這不是問題。 – 2013-03-23 05:18:40

+0

是的,他的答案好多了。 – 2013-03-23 06:26:25