Как я могу извлечь несколько строк с помощью регулярных выражений в Java? - PullRequest
3 голосов
/ 05 августа 2011

Если у меня есть куча текста, скажем, HTML, но это не обязательно.

</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);
    }

1 Ответ

10 голосов
/ 05 августа 2011

Используйте переключатель (?s):

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

Этот переключатель включает «точка соответствует новой строке» для оставшейся части регулярного выражения, что означает, что по существу он обрабатывает весь ввод «одной строкой» (новые строки являются просто другим символом).

Без этого параметра шаблоны не будут совпадать с границей новой строки.

Кроме того, ваше регулярное выражение было "жадным", поэтому я добавил ? к захвату, чтобы сделать его "не жадным", что означает, что он захватит достаточно, чтобы сделать совпадение, но не более.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...