java验证四则运算公式的合法性(包含括号、字母、小数)
1.场景描述
在实际的业务中,一个测点需要根据其他多个已知测点计算得出,在页面中输入计算公式,需要调用后台接口验证计算公式的合法性。比如验证a乘以2,m乘以2.0,(d002乘以2)加上2,(d*2)+,(e+3)/3,(ef001+3,1/1等合法性。
2.工具类示例
/**
* 验证表达式工具类
*/
public class ExpressionUtils {
/**
* 验证四则运算表达式是否准确
* @param expression
* @return
*/
public static boolean validateExpression(String expression) {
//第一步:去掉算式中所有的合法项替换为"?"字符,去掉替换后算式中所有的空格
expression = expression.replaceAll("((K|Z|C)\\d\\$(\\d)+(\\.(\\d)*){0,1})", "?");
expression = expression.replaceAll(" ", "");
// 如果有两个相邻的项中间没有操作符,则算式不合法
if (expression.matches("^??$")) {
return false;
}
if (expression.matches("^(.)*max\\(\\?-\\?,\\d\\)(.)*$")) {
expression = expression.replaceAll("max\\(\\?-\\?,\\d\\)", "?");
}
// 第二步:判断小括号左右括弧是否等同,括弧位置是否合法,如果括弧全部合法,则去掉所有括弧
int num = 0;
char[] expCharArray = expression.toCharArray();
for (int i = 0; i < expCharArray.length; i++) {
char temp = expCharArray[i];
if (temp == '(') {
num++;
} else if (temp == ')') {
num--;
}
if (num < 0) {
return false;
}
}
if (num > 0) {
return false;
}
//去掉括号,进行验证
expression = expression.replaceAll("\\(|\\)", "");
// 最后一步:判断仅剩的+-*/四则运算算式是否合法,字母数字(增加包含小数)
if (expression.matches("^(([+-]+[a-zA-Z0-9\\.]+[-+*/])*[a-zA-Z0-9\\.]+([-+*/][a-zA-Z0-9\\.]+)*)$")) {
return true;
} else {
return false;
}
}
}