四则运算表达式解析,分离分子和分母表达式(Java实现)
背景需求
最近项目中遇到这样一个问题。在做指标归因分析的过程中,需要将一个指标运算的逻辑拆解出来,也就是将指标的分子表达式和分母表达式解析出来。比如这样一个指标: (xinzhuangxiu_mendiandaofang+xinzhuangxiu_mendianchenhui)/xinzhuangxiu_qiandaozongliang,需要将分子分母分别提取出来返回。
最终采用了栈+逆波兰 的处理方式。
Step1:将运算表达式字符串分解为运算表达式List
Step2:将运算表达式List转换为逆波兰表达式List
Step3:逆波兰表达式运算
最终可以实现分子分母表达式的解析,并支持中文指标名
执行代码
package com.ke.bigdata.aas.util;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
* 四则混合运算表达式解析
* @author WeiZhaolin
*/
public class ExpParserUtil {
/**
* 运算符枚举
*/
private enum Operator {
ADD("+", 10), SUBTRACT("-", 10), MULTIPLY("*", 20), DIVIDE("/", 20),
PARENTHESIS_LEFT("(", 100), PARENTHESIS_RIGHT(")", 100);
private String operator;
private int priority;
private Operator(String operator, int priority) {
this.operator = operator;
this.priority = priority;
}
}
/**
* 获取字符串所对应的运算符枚举
* @param str
* @return
*/
private static Operator getOperator(String str) {
for (Operator op : Operator.values()) {
if (str.equals(op.operator)) {
return op;
}
}
return null;
}
/**
* 第1步: 将运算表达式字符串分解为运算表达式List
*
* @param exp
* @return
*/
private static List<String> resolveExpr(String exp) {
List<String> list = new LinkedList<String>();
String temp = "";
exp = exp.replace(" ", "");
for (int i = 0; i < exp.length(); i++) {
String str = exp.substring(i, i + 1);
Operator op = getOperator(str);
// Operand od = getOperand(str);
if (op != null) {
if (!temp.