Java中的正则表达式问题,多个匹配

4
我正在尝试匹配HTML文档中的多个CSS样式代码块。此代码将匹配第一个,但不会匹配第二个。我需要什么代码才能匹配第二个?我可以只获取我的“style”括号内部的组列表吗?我应该调用“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个回答

14

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

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

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

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

That's a greedy expression. The (.*) in the middle will match as much as it possibly can. If you have two style blocks:

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

使用(.*?)获取非贪婪表达式,它将允许尽早匹配到结尾的 (</style>) 标记。

我应该调用“find”方法来获取下一个匹配吗?

是的,你应该使用它来获取第一个匹配项。通常的习惯用法是:

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

请注意,对于仅使用完全固定字符串的情况,标准字符串处理(indexOf等)可能比正则表达式更简单易用。然而,标准答案仍然适用。


谢谢,我也不知道matcher.find()。但是在Java中我很少需要正则表达式 :) - sirprize

0
您可以将正则表达式简化如下:
(<style type="text/css">)(.*?)(</style>)

如果您不需要第1组和第3组(可能不需要),我建议去掉括号,只留下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接