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

