解析自定义公式是否合法

来源:互联网 发布:上海游族网络招聘电话 编辑:程序博客网 时间:2024/05/17 17:15

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


                                             
1 0
原创粉丝点击