标签:
// 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);
标签:
原文地址:http://www.cnblogs.com/a-ray-of-sunshine/p/4498565.html