java - java问题中的正则表达式,多个匹配项

标签 java regex

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

这是我的正则表达式

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

最佳答案

I am trying to match multiple CSS style code blocks in a HTML document.

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

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

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

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

然后它会愉快地匹配'1</style> <style type="text/css">2'。

使用 (.*?) 获取非贪婪表达式,这将允许尾随 (</style>) 在第一时间匹配。

Should I call the 'find' method to get the next match?

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

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

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

关于java - java问题中的正则表达式,多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/465979/

相关文章:

Java泛型方法,通配符List返回类型

java - 捕获已启用字段的字符

java - 这里应该有两个错误,但我看不到它们

php - 清理货币字符串的快速方法

java - 将两个大整数值相乘会得到不正确的结果

java - 在链接列表中使用对象/继承类

regex - Visual Studio代码中使用什么正则表达式变体?

javascript - 正则表达式匹配较长的项目

javascript - Regex - 将 C# Regex 转换为 JavaScript Regex 的量词的目标无效

C++正则表达式将字符串拆分为数组