JS解析表达式

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