如何使用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
相关产品推荐
相关产品推荐

