【问题标题】:java Regular expression matching htmljava正则表达式匹配html
【发布时间】:2011-02-17 01:20:53
【问题描述】:

解决方案: 这行得通:

字符串 p="
[\\\\w\\\\W]*
";

我想匹配并捕获

 标签的封闭内容
试了以下,还是不行,怎么回事?


字符串 p="
.*
"; 匹配器 m=Pattern.compile(p,Pattern.MULTILINE|Pattern.CASE_INSENSITIVE).matcher(input); 如果(m.find()){ 字符串 g=m.group(0); System.out.println("g 为 "+g); }

【问题讨论】:

  • 说真的,您不应该使用正则表达式解析 HTML。请改用 TagSoup 之类的库。
  • 我们又来了……您尝试搜索了吗?这个指导怎么样 - stackoverflow.com/questions/2400623/…
  • [\\\\w\\\\W] 将匹配反斜杠 wW。您的意思可能是[\\w\\W],但您不需要这样做。正如我在回答中所说,只需使用 DOTALL 标志。另一个技巧在 JavaScript 中被大量使用,因为 JS 没有 DOTALL 标志的等效项。

标签: java html regex


【解决方案1】:

Regex 实际上是not 的正确工具。使用解析器。 Jsoup 不错。

Document document = Jsoup.parse(html);
for (Element element : document.getElementsByTag("pre")) {
    System.out.println(element.text());
}

parse() 方法也可以采用URLFile 顺便说一句。


我推荐 Jsoup 的原因是它是我尝试过的所有 HTML 解析器中最不冗长的。它不仅提供类似 JavaScript 的方法返回实现 Iterable 的元素,而且还支持 jQuery like selectors,这对我来说是一个加分项。

【讨论】:

    【解决方案2】:

    您需要 DOTALL 标志,而不是 MULTILINE。 MULTILINE 改变了^$ 的行为,而DOTALL 是让. 匹配行分隔符的那个。您可能也想使用不情愿的量词:

    String p = "<pre>.*?</pre>";
    

    【讨论】:

    • 如果有多个&lt;pre&gt; 元素,一个贪婪的.* 将从第一个开始&lt;pre&gt; 匹配到最后一个结束&lt;/pre&gt;。不情愿(或非贪婪).*? 将在第一个结束标记处停止。
    【解决方案3】:
    String stringToSearch = "H1 FOUR H1 SCORE AND SEVEN YEARS AGO OUR FATHER...";
    
    // the case-insensitive pattern we want to search for
    Pattern p = Pattern.compile("H1", Pattern.CASE_INSENSITIVE);
    
    Matcher m = p.matcher(stringToSearch);
    
    // see if we found a match
    int count = 0;
    while (m.find())
        count++;
    
    System.out.println("H1 : "+count);   
    

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多