解析自定义公式是否合法
2016-12-06 16:27
393 查看
确定元素
![](https://oscdn.geek-share.com/Uploads/Images/Content/201612/06/3779485bc1fd7f9055af1804aea6ec12)
解析公式
完整公式:个人得分*((中心总人数*100)/中心总得分)
分析
公式中的元素除了自定义元素外,就是括号和运算符
解析括号是否合法,通过js便利公式字符串,找出里面所有的左括号和右括号,如果数量不对等,肯定不合法.
验证括号合法后,将括号从公式字符串中去掉,使用js的replace方法, str.replace(/[\(\)]/g,'')
验证运算符和元素是否合法,使用正则替换所有运算符为','逗号,然后以逗号分组,判断是否有元素为空,如果有空则肯定不合法.如果没有空的,则以正则的方式去验证每一个元素是否是规定的元素,如果不是,则肯定不合法.
解析公式
完整公式:个人得分*((中心总人数*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; }
相关文章推荐
- 动态自定义在后台验证输入值是否合法
- 动态自定义在后台验证输入值是否合法
- PL/SQL自定义:函数检查日期字符串是否合法
- 公式解析 在某些应用中,为了支持灵活性,往往用到自定义的公式。 比如,有如下的原始公式集合:
- oracle自定义函数验证身份证是否合法
- C#检测输入的邮件地址是否合法
- 判断用户选择的本地文件大小是否合法
- 用正则表达式判断时间是否合法
- 【用友问题】自定义项显示进货仓库,以及是否审核
- 如何自定义特性并解析它们
- 判断用户选择的本地文件大小是否合法
- 实现工资自定义公式的计算方法示例
- C# 判断一字符串是否为合法数字(正则表达式)
- javascript判断日期是否合法
- 使用ASP.NET Atlas开发实时验证用户名是否被注册的自定义Behavior
- 各种判断输入数据是否合法的js
- [Page_IsValid]检验页面中的所有输入是否都合法
- 正则表达式判断时间是否合法
- js中判断字符串是否为合法的email格式
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!