如何编写正则表达式拆分特定运算符以提取公式的操作数与运算符数组
提取指定运算符的正则方案
嘿,刚好碰到过类似的需求,我来给你捋清楚怎么写这个正则!
首先要明确:我们需要匹配的运算符里有双字符的(<=、>=)和单字符的(^、*、>、<、+、-、!、$),正则里一定要先匹配双字符的,不然会把<=拆成<和=两个单独的运算符,这就错了。
正确的正则表达式
用来匹配指定运算符的正则是:
<=|>=|\^|\*|>|<|\+|-|!|\$
正则解释:
<=|>=:优先匹配双字符的比较运算符,保证不会被拆分\^:转义^(正则中^表示字符串开头,必须转义才能匹配字面量)\*:转义*(正则中*表示匹配0次或多次,转义后匹配字面量乘号)>|<:匹配单字符的大于、小于号\+:转义+(正则中+表示匹配1次或多次,转义后匹配字面量加号)-:匹配减号(这里不需要转义,因为不在字符集的特殊位置)!:匹配感叹号\$:转义$(正则中$表示字符串结尾,转义后匹配字面量$)
代码示例(Java环境)
因为你提到了String.split,推测是Java场景,这里用Pattern和Matcher来提取所有运算符:
import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class FormulaSplitter { public static void main(String[] args) { String formula = "17-(23+4)*5$"; // 匹配指定运算符的正则 String operatorRegex = "<=|>=|\\^|\\*|>|<|\\+|-|!|\\$"; Pattern pattern = Pattern.compile(operatorRegex); Matcher matcher = pattern.matcher(formula); List<String> operators = new ArrayList<>(); while (matcher.find()) { operators.add(matcher.group()); } // 输出运算符数组 System.out.println("运算符数组:" + operators); // 输出:[-, +, *, $] // 你已经有的数值提取正则 String[] numbers = formula.split("\\s*[^0-9]+\\s*"); System.out.println("数值数组:"); for (String num : numbers) { if (!num.isEmpty()) { // 过滤split可能产生的空字符串 System.out.println(num); } } } }
注意点
- 如果你的公式里有全角符号(比如你例子里的
−是全角减号),需要把它加到正则里,或者先转成全角符号再处理 split提取数值时可能会产生空字符串,记得过滤掉- 正则的顺序很重要:双字符运算符必须放在单字符前面,否则会被错误拆分
内容的提问来源于stack exchange,提问作者z1to
相关产品推荐
相关产品推荐

