2013-04-11 30 views
0

我正在使用一個外部的API,我們只允許我使用正則表達式,我想從xml標籤中解析內容,如<name>alwin</name>,我用<.*?>.*?<.*/>解析「alwin」..它不起作用,但現在它已經結構化像<name><![CDATA[<table>alwin</table>]]</name>,我也想解析CDATA ..我也想提取[![CDATA[<table>alwin</table]]。也只是「阿爾溫」。這個正則表達式在xml中不適用於CDATA。我該如何解決?

+3

請參閱[本文所示答案](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – 2013-04-11 06:32:27

回答

0

嘗試使用這種模式,而不是:

<([a-zA-Z]+).*?>(.*?)</\1> 

\1子句靶向第一匹配組的圖案,即([a-zA-Z]+)。因此,匹配的結束標記將始終與開始標記相同。

標籤的內容將隨後是第二組中的可用的:

Pattern p = Pattern.compile("<([a-zA-Z]+).*?>(.*?)</\\1>"); 
Matcher m = p.matcher("<name><![CDATA[<table>alwin</table>]]</name>"); 
while (m.find()) { 
    System.out.println(m.group(2)); 
} 

上面片斷輸出:

<![CDATA[<table>alwin</table>]] 

重申上述輸出的圖案,以獲得alwin一部分。

+1

此方法將失敗'CDATA []]>'因爲它將匹配外部與CDATA內部的。對於通常嵌套的相同標籤甚至忽略CDATA問題也會失敗。 – drquicksilver 2013-04-12 14:02:53