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

Java运算式正则拆分原理咨询及提取运算符的正则写法求助

原正则生效逻辑解释

你使用的拆分正则为(?<=[^+*/-])[+*/-],原理如下:

  • (?<=[^+*/-])是零宽正向后行断言,只会匹配位置、不会消耗字符:要求当前位置的前一个字符必须不属于+、*、/、-四个运算符范畴。
  • 后缀的[+*/-]匹配四个运算符中的任意一个。

整体正则只会匹配「前面紧跟非运算符的运算符」,也就是作为二元运算连接符的运算符,不会匹配作为负号前缀的-(负号-前面一定是其他运算符,不符合后行断言的规则)。split操作会删除所有匹配到的运算符,剩下的片段就是你需要的带负号的运算数,和预期结果一致。

提取运算符的正则实现

要拆分得到所有运算符,思路反过来:匹配所有运算数作为split的分隔项,删除运算数后剩下的片段就是运算符。
匹配运算数的正则为(^|(?<=[+*/-]))-?[^+*/-]+,规则说明:

  • (^|(?<=[+*/-]))限定运算数的起始位置:要么是字符串开头,要么前面紧跟运算符,用来识别负号-属于运算数的前缀。
  • -?匹配可选的负号前缀。
  • [^+*/-]+匹配运算数的主体部分(1个或多个非运算符字符)。

代码实现如下:

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        String eq = "5*i+-6-7+-i*5";
        String[] equation_operators = Arrays.stream(eq.split("(^|(?<=[+*/-]))-?[^+*/-]+"))
                .filter(s -> !s.isEmpty())
                .toArray(String[]::new);
    }
}

执行后equation_operators的结果就是[*, +, -, +, *],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:36:01