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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章