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

Java 9之前版本替代Matcher#replaceAll(Function)的实现方案咨询

解决低版本Java下替换函数式接口实现的问题

你这段代码里用到的Matcher.replaceAll(MatchResult -> String)是Java 8才引入的方法,这也是低版本服务器编译失败的核心原因。咱们可以用Java 7及更早版本就支持的appendReplacement和appendTail方法手动处理每个匹配项,完全不需要依赖函数式接口。

重写后的完整代码

public class Brackets {
    Pattern parentheses = Pattern.compile("\\([\\p{InARABIC}\\s\\$]+\\)|\\([\\p{InBasic_Latin}\\s\\$]+\\)|\\)([\\p{InARABIC}\\s]+)\\(", Pattern.CASE_INSENSITIVE);

    @Override
    public String replace(String text) {
        StringBuffer newText = new StringBuffer();
        Matcher parenthesesMatcher = parentheses.matcher(text);
        
        while (parenthesesMatcher.find()) {
            String replacement;
            if (parenthesesMatcher.group(1) == null) {
                // 无捕获组匹配,直接返回原匹配内容(转义特殊字符避免干扰)
                replacement = Matcher.quoteReplacement(parenthesesMatcher.group());
            } else {
                // 捕获组有内容,把)内容(格式转换成(内容)
                replacement = Matcher.quoteReplacement("(" + parenthesesMatcher.group(1) + ")");
            }
            // 将替换后的内容追加到结果缓冲区
            parenthesesMatcher.appendReplacement(newText, replacement);
        }
        // 追加匹配结束后剩余的文本
        parenthesesMatcher.appendTail(newText);
        
        return newText.toString();
    }
}

代码逻辑说明

  • 用StringBuffer逐步构建最终结果,这是低版本Java处理正则替换的标准方式
  • 通过while (parenthesesMatcher.find())循环遍历所有匹配项,逻辑和你原来的lambda完全对齐
  • 保留Matcher.quoteReplacement的调用,避免替换内容里的特殊字符(比如$)破坏正则替换逻辑
  • 最后用appendTail把匹配结束后剩下的文本追加到结果中,保证内容完整

测试验证

输入:

)أ( )السلام( هذا مجرد ) مثال ( .. طبعا

输出:

(أ) (السلام) هذا مجرد ( مثال ) .. طبعا

和你原代码的运行效果完全一致,且能在Java 7及更低版本的环境中正常编译运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:49