解析自定义公式是否合法

  1. 确定元素
  1. 解析公式
    1. 完整公式:个人得分*((中心总人数*100)/中心总得分)
    2. 分析
      1. 公式中的元素除了自定义元素外,就是括号和运算符
      2. 解析括号是否合法,通过js便利公式字符串,找出里面所有的左括号和右括号,如果数量不对等,肯定不合法.
      3. 验证括号合法后,将括号从公式字符串中去掉,使用js的replace方法, str.replace(/[\(\)]/g,'')  
      4. 验证运算符和元素是否合法,使用正则替换所有运算符为','逗号,然后以逗号分组,判断是否有元素为空,如果有空则肯定不合法.如果没有空的,则以正则的方式去验证每一个元素是否是规定的元素,如果不是,则肯定不合法.

	//解析公式
	    function analyze(str){
	         var flag =false;
	         var reg = /^(\d+(\.\d+)?)$|^(基础分值)$|^(日常任务得分)$|^(巡检任务得分)$|^(指派得分)$|^(加扣分项得分)$|^(个人得分)$|^(中心总人数)$|^(中心总得分)$/;
	         if(str.length!=0){
	             //最后一个位置不能是运算符
	             if(/[\+\-\*\/]/g.test(str.charAt(str.length-1))){
	                 $.messager.alert('提示','公式不合法,不能以运算符结尾!','info');
	                 return false;
	             }
	             //只要括号是成对的就没有问题
	             //左括号
	             var leftArr = findNum(str,'(');
	             //右括号
	             var rightArr = findNum(str,')');
	             if(leftArr.length!=rightArr.length){
	                 $.messager.alert('提示','公式不合法,括号不对应!','info');
	                 return false;
	             }
	             //再验证括号出现的位置是否合法
	             if(leftArr.length>0 && rightArr.length>0){
	            	 //左括号不会出现在最后位置
	            	 if(leftArr[leftArr.length-1]==(str.length-1)){
	            		 $.messager.alert('提示','公式不合法,请检查!','info'); 
	            		 return false;
	            	 }
	            	 //左括号合法性
	            	 for(var i=0;i<leftArr.length;i++){
	            		//判断前后字符是否合法
	            		if(leftArr[i]==0){
	            			continue;
	            		}
	            		var temp = str.substr(0,leftArr[i]);
	            		var tempReg = /[\(\+\-\*\/]/;
	            		//前字符只能是: ( 或 运算符,如果下标是0,则不去查询
	            		if(!tempReg.test(temp.substr(temp.length-2))){
	            			$.messager.alert('提示','公式不合法,请检查!','info');
	            			return false;
	            		}
	            		//后字符只能是: ( 或 元素
	            		temp = str.substr(leftArr[i]+1);
	            		var tempStr = temp.replace(/[\+\-\*\/]/g,',');
	            		tempStr = tempStr.split(',');
	            		if(!(temp.substr(0,1)=='(' || reg.test(tempStr[0]))){
	            			$.messager.alert('提示','公式不合法,请检查!','info');
	            			return false;
	            		}
	            		
	            		 
	            	 }
	            	 //右括号不会出现在第一个位置
	            	 if(rightArr[0]==0){
	            		 $.messager.alert('提示','公式不合法,请检查!','info');
	            		 return false;
	            	 }
	            	 //前面只能是元素
	            	 for(var i=0;i<rightArr.length;i++){
	            		//判断前后字符是否合法
	            		if(rightArr[i]==(str.length-1)){
		            		continue;
		            	}
	            		var temp = str.substr(0,rightArr[i]);
	            		//前字符: ) 或 元素
	            		var tempStr = temp.replace(/[\+\-\*\/]/g,',');
	            		tempStr = tempStr.split(',');
	            		if(!(temp.substr(temp.length-2,1)==')' || reg.test(tempStr[tempStr.length-1]))){
	            			$.messager.alert('提示','公式不合法,请检查!','info');
	            			return false;
	            		}
	            		//后字符: ) 或 运算符,如果下标是最后一位,则不去查询
	            		var temp = str.substr(rightArr[i]+1);
	            		var tempReg = /[\)\+\-\*\/]/;
	            		if(!tempReg.test(temp.substr(0,1))){
	            			$.messager.alert('提示','公式不合法,请检查!','info');
	            			return false;
	            		}
	            	 }
	             }
             	 //匹配
                 str = str.replace(/[\(\)]/g,'');
                 str = str.replace(/[\+\-\*\/]/g,',');
                 var arr = str.split(',');
                 for(var i=0;i<arr.length;i++){
                     if(arr[i]==''||!reg.test(arr[i])){
                         $.messager.alert('提示','公式不合法,请检查!','info');
                         return false;
                     }
                 }
                 flag = true;
	             
	         }
	         return flag;
	     }
	    //查询一个字符在字符串中出现的位置
	    function findNum(src,char){
	         var locationArr = new Array();
	         for(var i=0;i<src.length;i++){
	             if(char == src.charAt(i)){
	                 locationArr.push(i);
	             }
	         }
	         return locationArr;
	     }





  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值