2011-08-05 49 views
3

如果我有一堆文本,讓我們說HTML,但它不一定是。如何在java中使用正則表達式提取多行?

</TD> 
<TD CLASS='statusEven'><TABLE BORDER=0 WIDTH='100%' CELLSPACING=0 CELLPADDING=0><TR><TD   ALIGN=LEFT><TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0> 
<TR> 
<TD ALIGN=LEFT valign=center CLASS='statusEven'><A HREF='extinfo.cgi? type=2&host=localhost&service=Current+Load'>Current Load</A></TD></TR> 
</TABLE> 
</TD> 
<TD ALIGN=RIGHT CLASS='statusEven'> 
<TABLE BORDER=0 cellspacing=0 cellpadding=0> 
<TR> 
</TR> 
</TABLE> 
</TD> 
</TR></TABLE></TD> 
<TD CLASS='statusOK'>OK</TD> 
<TD CLASS='statusEven' nowrap>08-04-2011 22:07:00</TD> 
<TD CLASS='statusEven' nowrap>28d 13h 18m 11s</TD> 
<TD CLASS='statusEven'>1/1</TD> 
<TD CLASS='statusEven' valign='center'>OK &#45; load average&#58; 0&#46;01&#44; 0&#46;04&#44; 0&#46;05&nbsp;</TD> 

,我想搶到2個標記之間的一切,其結果很可能是多行,我會怎麼做呢?

這裏是我到目前爲止....

Pattern p = Pattern.compile("extinfo(.*)load average"); 
    Matcher m = p.matcher(this.resultHTML); 

    if(m.find()) 
    { 
     return m.group(1); 
    } 

回答

10

使用(?s)開關:

Pattern p = Pattern.compile("(?s)extinfo(.*?)load average") 

此開關打開「點相匹配換行」爲正則表達式的剩餘部分,這意味着它本質上將整個輸入視爲「一行」(換行符只是另一個字符)。

如果沒有此開關,模式將不匹配換行符邊界。

另外,你的正則表達式是「貪婪」的,所以我加入了?來捕獲它使其「不貪婪」,這意味着它將捕獲足夠的數據以進行匹配,但不會更多。

+0

確定很酷。我如何阻止它被貪婪?模式p = Pattern.compile(「(?s) kireol

+0

我編輯了正則表達式而不是貪婪 - 只需添加'?' - 見答案 – Bohemian

+0

您也可以使用'Pattern.DOTALL'開關作爲compile的第二個參數。我不知道你可以在模式本身指定開關;感謝那。 –