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
相关产品推荐
相关产品推荐

