JS解析表达式

来源:互联网 发布:磁力链接解析源码 编辑:程序博客网 时间:2024/06/17 17:39
// var express = "num1+num2*(num3-num_4)";// var express = "num1+num2*(num3*(num_4-num5))";var express = "(num1+num2)*(num3*(num_4-num5))-78";// 以运算符为分组单位,提取变量(变量不可能连续出现,所以这样可以成功)var operatorReg = /[\(\)\+\-\*\/]/;var variables = express.split(operatorReg);var variablesLen = variables.length;var varArr = [];for(var i = 0; i < variablesLen; i++){if('' != variables[i]){varArr.push(variables[i]);}}variablesLen = varArr.length;//alert(varArr);// 以变量为单位提取,运算符(运算符有可能连续出现,所以下面的做法有问题)/*var variableReg = /[0-9a-zA-Z_]+/;var operators = express.split(variableReg);var operatorsLen = operators.length;var operArr = [];for(var i = 0; i < operatorsLen; i++){if('' != operators[i]){operArr.push(operators[i]);}}*///alert(operArr);var operArr = [];var pattern = new RegExp("[\\(\\)\\+\\-\\*\\/]", "g");var operIndex = [];while(pattern.test(express)){operIndex.push(pattern.lastIndex - 1);operArr.push(express.substr(pattern.lastIndex-1, 1));}var operatorsLen = operIndex.length;// alert(operIndex);// alert(operArr);// 将 varArr 计算之后还原回去var resStr = "";var i = 0;// 指示当前变量var j = 0;  // 指示当前运算符var isVar = false; // 上一个是变量var expressLen = variablesLen + operatorsLen;for(var cnt = 0; cnt < expressLen; cnt++){// 当前操作数var ch = varArr[i];// 当前运算符var currOper = operArr[j];// 第一个符号if(0 == cnt){ // 说明运算符是第一个符号有可能是,括号()if(0 == operIndex[0]){resStr += currOper;isVar = false;j++;// 运算符下移一位}else{resStr += ch;isVar = true;i++;// 变量下移一位}continue;}if(isVar){// 上一个是变量resStr += currOper;isVar =false;j++;}else{// 上一个是运算符// 如果下一个符号和当前符号的索引连续,则仍然添加符号if(operIndex[j-1] == operIndex[j]-1){resStr += currOper;isVar = false;j++;// 运算符下移一位}else{resStr += ch;isVar = true;i++;// 变量下移一位}}}alert(resStr);

0 0
原创粉丝点击