2013-01-16 115 views
0

輸入:Java正則表達式提取的標籤之間的內容

<tag>Testing different formatting options in </tag><tag class="classA classB">Text</tag><tag class="classC">Class C text</tag> 

預期輸出:

<tag>Testing different formatting options in </tag><tagA><tabB>Text</tagA></tagB><tagC>Class C text</tag> 

基本上標籤通過基於在 「類」 的屬性的標籤替換。 。即,如果屬性具有CLASSA屬性,則標籤將通過TAGA代替,如果CLASSB屬性也出現,則標籤也將包括TAGB等..

嘗試製成:

final String TAG_GROUPS = "<tag class=\"(.*)\">(.*)</tag>"; 
    Pattern pattern = Pattern.compile(TAG_GROUPS); 
    Matcher matcher = pattern.matcher(inputString); 

我收到的輸出無法找到匹配的標籤。特別是聲明

String classes = matcher.group(1); 

給出字符串classA classB">Text</tag><tag class="classC">Class C text</tag。模式匹配器無法找到匹配的標籤。我是正則表達式的初學者,我想知道問題的正確模式。任何幫助表示讚賞。

+8

使用正則表達式解析XML很棘手,因爲這篇文章闡明瞭:http://stackoverflow.com/a/1732454/758446 – BlackVegetable

+0

使用'。*?'而不是'。*':*? - 不情願的版本,它儘可能少地匹配 –

回答

1

當您使用*時,它會嘗試吸收所有可能的字符(貪婪)。

如果您想要.*匹配較少可能的字符,您必須使用與*?的惰性匹配。

所以,你的正則表達式得到爲:

<tag class=\"(.*?)\">(.*?)</tag> 

以上,是最簡單的方式。但沒有必要的最佳方式。懶惰的比賽比貪婪更慢,如果可以的話,你必須儘量避免它。例如,如果你估計你的代碼是正確的(沒有標籤沒有標籤損壞等),最好使用否定類而不是.*?。例如,你的正則表達式可以寫爲:

<tag class="([^"]*)">([^<]*)</tag> 

女巫是正則表達式引擎更有效(但並不總是能夠轉換懶惰匹配否定類)。

當然,如果你想要解析一個完整的html或xml文檔,你必須做很多不同的修改,最好使用一個xml(html)解析器。

1

雖然您可以使用regexp來查找開始標記並解析類,但是沒有辦法生成嵌套標記作爲輸出。詳情請參閱this answer

你可以做的是寫你自己的簡單的HTML解析器,但HTML是相當混亂的解析。或者換句話說:看看我的聲譽,然後考慮如果沒有一個很好的理由(比如有人給我五十萬美元),我不會嘗試它。

改爲使用真實的HTML解析器,如HTML Tidy

2

你應該使用貪婪的正則表達式:"<tag class=\"(.*?)\">(.*)</tag>"。否則.*匹配任何字符包括</tag>

但通常我同意大家這不是使用正則表達式解析XML的最佳實踐。改用XML解析器。

+2

這是不願意的正則表達式不貪婪。貪婪默認使用沒有問號。 –

+0

而你必須在第二個參數中放入懶惰(或不情願)的正則表達式。試着解析這個例子,你會看到這個問題。 – PhoneixS

相關問題