java验证四则运算公式的合法性(包含括号、字母、小数)

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;
		}

	}
	
}

3.验证

在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值