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

Java中如何使用正则表达式移除字符串内的HTML标签

问题根因

你写的两个正则触发StackOverflowError的核心原因是Java正则引擎采用递归回溯实现匹配,你写的([a-zA-Z0-9]|\s|\S)+、([a-zA-Z0-9]|\s|\W)+属于分组嵌套量词的写法,匹配过程中会产生巨量回溯路径,处理稍长的HTML文本时递归深度就会超过JVM栈上限,直接抛错。

你关于IDE转义的判断是对的:Java字符串中反斜杠是转义字符,正则里的\s、\W这类转义序列,在Java字符串字面量里必须写成\\s、\\W,IntelliJ的自动转换是符合Java语法要求的,不是什么JS正则转Java的适配bug。

实现方案

1. 轻量正则方案(适配你当前的简单提取场景)

别写嵌套分组加量词的复杂逻辑,直接用无回溯的排除型字符组匹配标签即可,不会触发栈溢出,代码示例:

String html = "<tr class='list odd'>\n" +
        "<td class=\"list\" align=\"center\">Do</td>\n" +
        "<td class=\"list\" align=\"center\">7.7.</td><td class=\"list\" align=\"center\">3 - 4</td>\n" +
        "<td class=\"list\" align=\"center\">---</td>\n" +
        "<td class=\"list\" align=\"center\"><s>Q1e14</s></td>\n" +
        "<td class=\"list\" align=\"center\">Arbeitsauftrag:</td>\n" +
        "<td class=\"list\" align=\"center\">entfällt</td></tr>";
// 正则逻辑:匹配<开头,往后匹配所有非>的字符,直到遇到第一个>结束,全程无回溯
String plainText = html.replaceAll("<[^>]+>", "");
// 可选:压缩标签移除后产生的多余空行、缩进
plainText = plainText.replaceAll("\\n\\s*", "\n").trim();
System.out.println(plainText);

运行后输出和你预期的结果完全一致:

Do
7.7.
3 - 4
---
Q1e14
Arbeitsauftrag:
entfällt

注意:这个方案仅适合结构规范、标签属性内没有未转义>字符的简单HTML场景,不要用它解析结构复杂、格式不规范的HTML内容。

2. 生产级可靠方案(复杂HTML场景推荐)

正则本身无法覆盖HTML的所有语法边界(比如属性值里的转义尖括号、HTML注释、嵌套异常的标签、自闭合标签等),如果要处理生产环境的复杂HTML,直接用专门的HTML解析库比自己写正则靠谱得多,最常用的是Jsoup:

  • 先引入依赖(Maven配置示例):
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.17.2</version>
</dependency>
  • 提取纯文本的代码非常简洁,不需要自己处理各种标签边界:
import org.jsoup.Jsoup;

public class HtmlTextParse {
    public static void main(String[] args) {
        String html = "待解析的HTML内容";
        // 直接解析获取纯文本,自动处理所有标签、转义字符
        String plainText = Jsoup.parse(html).wholeText();
    }
}
你之前写的正则的具体问题
  • 第一个正则\u003C([a-zA-Z0-9]|\s|\S)+没有写闭合的>匹配规则,会出现越界匹配的问题,而且分组套重复量词的写法会产生指数级的回溯路径,长文本必然触发栈溢出
  • 第二个正则[\u003C]([a-zA-Z0-9]|\s|\W)+\u003E同样存在分组嵌套量词的问题,Java正则引擎处理这类模式时递归深度随匹配文本长度线性增长,只要文本长度超过栈承载上限就会抛错
  • 冗余写法问题:\s|\S、\w|\W这类写法完全多余,两个互补的字符集取或等价于匹配所有字符,直接写对应字符组即可,没必要加或逻辑徒增正则引擎的处理负担。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:36:27