2009-01-21 40 views
4

我想在HTML文档中匹配多个CSS样式代码块。此代码将与第一个匹配,但不匹配第二个。我需要什么代码来匹配第二个。我可以只获取我的'样式'括号内的组的列表吗?我应该调用'find'方法来获得下一场比赛吗?正则表达式java问题,多个匹配

这里是我的正则表达式模式

^.*(<style type="text/css">)(.*)(</style>).*$ 

用法:

final Pattern pattern_css = Pattern.compile(css_pattern_buf.toString(), 
        Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 

final Matcher match_css = pattern_css.matcher(text); 
     if (match_css.matches() && (match_css.groupCount() >= 3)) { 
      System.out.println("Woot ==>" + match_css.groupCount()); 
      System.out.println(match_css.group(2)); 
     } else { 
      System.out.println("No Match"); 
     } 

回答

14

我想一个HTML文档中匹配多个CSS样式代码块。

标准答案:不要使用正则表达式来解析HTML。正则表达式不能可靠地解析HTML,无论你如何复杂和聪明地表达你的表达。除非您完全确定目标文档的确切格式完全固定,否则字符串或正则表达式处理不足,您必须使用HTML解析器。

(<style type="text/css">)(.*)(</style>) 

这是一个贪婪的表达。中间的(。*)将尽可能匹配。如果你有两个样式块:

<style type="text/css">1</style> <style type="text/css">2</style> 

那么它会高兴地匹配 '1 < /风格> <风格类型= “文/ CSS”> 2'。

使用(。*?)得到一个非贪婪的表达式,这将允许尾随(</style>)在第一次机会时匹配。

我应该调用'find'方法来获得下一场比赛吗?

是的,你应该用它来获得第一场比赛。通常的成语是:

while (matcher.find()) { 
    s= matcher.group(n); 
} 

注意,标准字符串处理(的indexOf等)可能是一个更简单的方法为你比正则表达式,因为你只使用完全固定字符串。但是,标准答案仍然适用。

+0

谢谢,我还没有意识到matcher.find()。但是,我经常不需要Java中的正则表达式:) – sirprize 2009-01-23 10:17:48

0

可以简化正则表达式如下:

(<style type="text/css">)(.*?)(</style>) 

如果你不需要组1和3(可能不是),我将放弃括号,仅存:

<style type="text/css">(.*?)</style>