正则表达式在java问题,多个匹配

时间:2009-01-21 16:33:13

标签: java regex

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

这是我的正则表达式

^.*(<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");
        }

2 个答案:

答案 0 :(得分:14)

  

我正在尝试匹配HTML文档中的多个CSS样式代码块。

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

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

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

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

然后它会愉快地匹配'1&lt; / style&gt; &lt; style type =“text / css”&gt; 2'。

使用(。*?)获取非贪婪的表达式,这将允许尾随(&lt; / style&gt;)在第一次机会时匹配。

  

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

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

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

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

答案 1 :(得分:0)

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

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

如果你不需要第1组和第3组(可能不是),我会删除括号,仅保留:

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