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

求助:Java中使用正则表达式拆分HTML字符串并保留分隔符的实现方案

解决Java中拆分转义HTML标签与文本的问题

嘿,我完全懂你现在的困惑——Java的正则后顾断言确实有个坑:它不支持无限长度的后顾断言,这就是你用那个包含*的后顾表达式报错的原因。不过咱们有更稳妥的办法实现你想要的拆分效果,把转义后的HTML标签和纯文本彻底分开,方便后续翻译再重建原字符串。

方案一:用匹配代替拆分(推荐)

与其纠结拆分的断言限制,不如直接匹配所有转义后的标签,同时提取标签之间的纯文本。这种方式更直观,也不会受正则断言的限制。

代码示例

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

public class HtmlTokenSplitter {
    public static void main(String[] args) {
        String original = "<b>hello!</b><br><br><b><u>this is an example</u></b><br>";
        // 正则匹配转义后的HTML标签:以<开头,>结尾,中间是除了>之外的内容
        Pattern tagPattern = Pattern.compile("<[^>]+>");
        Matcher matcher = tagPattern.matcher(original);

        int lastPosition = 0;
        while (matcher.find()) {
            // 提取当前标签之前的纯文本(如果非空)
            String textSegment = original.substring(lastPosition, matcher.start()).trim();
            if (!textSegment.isEmpty()) {
                System.out.println(textSegment);
            }
            // 输出匹配到的标签
            System.out.println(matcher.group());
            // 更新位置,处理下一段内容
            lastPosition = matcher.end();
        }
        // 处理最后一段可能存在的纯文本
        String finalText = original.substring(lastPosition).trim();
        if (!finalText.isEmpty()) {
            System.out.println(finalText);
        }
    }
}

输出结果

运行这段代码后,你会得到完全符合预期的输出:

<b>
hello!
</b>
<br>
<br>
<b>
<u>
this is an example
</u>
</b>
<br>

为什么你的后顾断言会报错?

Java的正则引擎(Oracle官方实现)对后顾断言有严格的长度限制:它只允许固定长度或者有限范围的变长(比如(?<=.{1,100})),而你写的(?&lt;=&lt;(“[^”]*”|'[^’]*’|[^'”&gt;])*&gt;)里的*是无限重复,引擎无法确定这个后顾组的最大长度,所以直接抛出了"Look-behind group does not have an obvious maximum length"的错误。

后续建议

拆分完成后,你可以遍历所有token:

  • 遇到纯文本时,调用翻译API进行转换
  • 遇到标签时直接保留
    最后按原顺序拼接所有token,就能完整还原出翻译后的富文本内容啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:48:16