2011-08-05 4 views
3

제가 텍스트가 많다면 HTML이라고 말하지만 그렇게 할 필요는 없습니다.어떻게 자바에서 regex로 여러 줄을 추출 할 수 있습니까?

</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> 

두 마커 사이의 모든 것을 잡아서 결과가 여러 줄로 표시되기를 바랍니다. 어떻게해야합니까?

가 여기에 사용

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") 

이 스위치는 정규 표현식의 나머지 "점은 줄 바꿈과 일치"를 사용하도록 설정 한 경우, 이것은 본질적으로 전체 입력을 "한 줄"로 취급한다는 것을 의미합니다 (줄 바꿈은 다른 문자 일뿐입니다).

이 스위치가 없으면 패턴이 줄 바꿈 경계에서 일치하지 않습니다.

또한 정규 표현식은 "greedy"이므로 ?을 캡처에 추가하여 "욕심이 많지 않게"만들 수 있습니다. 즉, 일치하는 데 충분하지만 더 이상 캡처하지는 않습니다.

+0

좋아요. 내가 욕심을 느끼지 않게하려면 어떻게해야합니까? 패턴 p = Pattern.compile ("(? s) kireol

+0

나는 greedy이 아닌 정규식을 편집했다. 단지'?'를 추가했다. - 대답 참조 – Bohemian

+0

'Pattern.DOTALL' 스위치를'compile'의 두 번째 인수로 사용할 수도 있습니다. 패턴 자체에서 스위치를 지정할 수 있는지는 몰랐습니다. 그 덕분입니다. –

관련 문제