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

如何使用Java正则实现类似sed的字符串编辑替换功能?

解答

Java正则完全可以实现和sed同等的字符串编辑效果,不存在只能做匹配/过滤的限制。JDK提供的String.replaceAll()、Matcher类的替换API和sed的s替换命令逻辑完全对齐,你给出的sed处理逻辑可以1:1迁移到Java中实现。

实现方式1:和sed逻辑完全对齐的链式替换

你原来的sed命令分三个替换步骤,Java里直接链式调用replaceAll即可,仅需要注意Java字符串中正则的反斜杠需要双写转义:

public class CalcTokenSplit {
    public static void main(String[] args) {
        String input = "2 + 5* 61.2 -(32.5+7)/ 8";
        String output = input
                // 第一步:移除所有空白字符(空格、制表符等),对应sed第一个替换规则
                .replaceAll("[\\s]", "")
                // 第二步:给所有运算符(+-*/)、括号前后插入逗号,对应sed第二个替换规则
                .replaceAll("([+\\-*/()])", ",$1,")
                // 第三步:合并连续出现的多个逗号为单个,对应sed第三个替换规则
                .replaceAll(",+", ",");
        
        System.out.println(output);
    }
}

运行上述代码,输出结果和预期完全一致:

2,+,5,*,61.2,-,(,32.5,+,7,),/,8

如果要和你原sed命令的逻辑完全严格一致(只删空格和制表符,不处理其他空白),把第一步的正则改成[ \t]即可。

实现方式2:零宽断言分割(性能更优)

如果追求更高效率,也可以不用三次替换,直接用正则零宽断言识别词元边界做分割,一次正则处理就可以得到结果:

import java.util.Arrays;
import java.util.stream.Collectors;

public class CalcTokenSplit {
    public static void main(String[] args) {
        String input = "2 + 5* 61.2 -(32.5+7)/ 8";
        String output = Arrays.stream(
                // 匹配运算符/括号前后的边界,同时自动忽略边界周围的空白
                input.split("\\s*(?=[+\\-*/()])|(?<=[+\\-*/()])\\s*")
            )
            .filter(s -> !s.isEmpty())
            .collect(Collectors.joining(","));
        
        System.out.println(output);
    }
}

这种写法的输出和第一种方式完全一致,后续如果需要扩展支持更多运算符(比如幂运算^、取模%),只需要在字符组里新增对应符号即可,维护成本更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:19