您的位置:首页 > Web前端 > JavaScript

解析自定义公式是否合法

2016-12-06 16:27 393 查看
确定元素



解析公式
完整公式:个人得分*((中心总人数*100)/中心总得分)

分析
公式中的元素除了自定义元素外,就是括号和运算符

解析括号是否合法,通过js便利公式字符串,找出里面所有的左括号和右括号,如果数量不对等,肯定不合法.

验证括号合法后,将括号从公式字符串中去掉,使用js的replace方法, str.replace(/[\(\)]/g,'')  

验证运算符和元素是否合法,使用正则替换所有运算符为','逗号,然后以逗号分组,判断是否有元素为空,如果有空则肯定不合法.如果没有空的,则以正则的方式去验证每一个元素是否是规定的元素,如果不是,则肯定不合法.

//解析公式
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;
}






                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息