You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则表达式匹配第二个实例失效问题求助

解决Java正则无法匹配多行HTML中第二个<style>标签的问题

这个问题我碰到过好几次啦!核心原因是Java正则默认的匹配规则不处理换行符,导致第二个<style>标签因为换行被跳过了。咱们一步步解决:

问题根源

你用的正则<style>(.+?)</style>里,.默认不匹配换行符(Java的Pattern默认关闭DOTALL模式)。如果你的HTML字符串里两个<style>标签是分两行的,第一个匹配结束后,剩下的内容开头是换行符,正则会跳过这个换行,导致找不到第二个<style>的起始标记。

解决方案:开启DOTALL模式

有两种方式开启这个模式,让.匹配包括换行在内的所有字符:

方式1:在正则开头添加(?s)标记

直接修改你的正则字符串:

String stylePattern = "(?s)<style>(.+?)</style>";

(?s)是正则的内联标记,作用等同于开启DOTALL模式。

方式2:编译Pattern时指定Pattern.DOTALL参数

如果你不想修改正则字符串,可以在编译时设置模式:

Pattern pattern = Pattern.compile("<style>(.+?)</style>", Pattern.DOTALL);

完整测试代码

下面是可以直接运行的示例,验证两个<style>标签都能被匹配到:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StylePathExtractor {
    public static void main(String[] args) {
        // 你的两行HTML字符串
        String htmlContent = "<style>templates/style/color.css</style>\n<style>templates/style/style.css</style>";
        
        // 带DOTALL模式的正则
        String regex = "(?s)<style>(.+?)</style>";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(htmlContent);
        
        // 遍历所有匹配结果
        while (matcher.find()) {
            System.out.println("捕获到的样式路径:" + matcher.group(1));
        }
    }
}

运行这段代码会输出:

捕获到的样式路径:templates/style/color.css
捕获到的样式路径:templates/style/style.css

额外优化(可选)

如果你的HTML里<style>标签可能带有属性(比如<style type="text/css">),可以把正则改成更健壮的版本,忽略标签内的属性:

String stylePattern = "(?s)<style\\s*[^>]*>(.+?)</style>";

小提醒

虽然正则能处理这种简单的HTML场景,但如果是复杂的HTML结构(比如嵌套标签、注释里的标签),更推荐用专门的HTML解析库(比如Jsoup),避免正则带来的各种边缘问题。

内容的提问来源于stack exchange,提问作者KOUSIK MANDAL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:00:35