Java Regex:严格匹配两个字符串之间的文本内部块

时间:2013-04-26 17:31:15

标签: java regex pattern-matching

我需要一个匹配两个字符串的正则表达式,但只接受内部块。我尝试使用不情愿的量词,但它没有用。

以下是一个例子:

<div>
    Hi
</div>
<div class = "quote">
    This is mail.
    <hr tabindex="-1">
    <div color="r">
        <b>From:</b>xyz<br>
        <b>Sent:</b>xyz PM<br>
        <b>To:</b>xyz<br><br>
    </div>
</div>

我使用了这个正则表达式,但它没有用(DOTALL匹配,所以“。”也匹配换行符)

<div.*(From:.*Sent:.*To:.*)*?</div>

以上正则表达式匹配所有内容,因为输入文本以<div>开头,以</div>结尾,但我需要在括号内指定的模式上方和下方。

所以我需要输出:

<div color="r">
        <b>From:</b>xyz<br>
        <b>Sent:</b>xyz PM<br>
        <b>To:</b>xyz<br><br>
</div>

提前致谢..

2 个答案:

答案 0 :(得分:0)

不建议使用正则表达式解析HTML。

如果您知道自己在做什么,那么可以使用以下String#replaceAll来电:

html.replaceAll
           ("(?i)(?s).*?(<div\\s*color.*?From:.*?Sent:.*?To:.*?</div>).*", "$1");

答案 1 :(得分:0)

试试这个。我正在扩展我的评论,所以你会明白我的意思:

  public String findText(String htmlString) {
    Pattern patt = Pattern.compile("<div.*</div>");
      Matcher m = patt.matcher(htmlString);
      while (m.find()) {
        String text = m.group(1);
        // check whether the value of text is the div you want
        if (text.indexOf("color") < text.indexOf(">")) { //... or something similar
           return (text);
        }
      }
    return null;
   }