java正则表达式匹配html

Posted

技术标签:

【中文标题】java正则表达式匹配html【英文标题】:java Regular expression matching 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 之类的库。 我们又来了……您尝试搜索了吗?这个指导怎么样 - ***.com/questions/2400623/… [\\\\w\\\\W] 将匹配反斜杠 wW。您的意思可能是[\\w\\W],但您不需要这样做。正如我在回答中所说,只需使用 DOTALL 标志。另一个技巧在 javascript 中被大量使用,因为 JS 没有 DOTALL 标志的等效项。 【参考方案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);   

【讨论】:

以上是关于java正则表达式匹配html的主要内容,如果未能解决你的问题,请参考以下文章

用JAVA语言编写正则表达式匹配指定的汉字的方法

java正则表达式

Java 正则表达式详解

Java 正则表达式详解

java-正则表达式

Java之正则表达式