任务是将作为数学表达式的输入字符串转换为真正的数学表达式,并在 java 脚本中计算其结果。eval()不能使用。
鉴于此,我决定使用字符串替换操作,在其中我取两个操作数和它们之间的一个运算符并执行数学运算。所有运算都必须像在实际数学中一样执行:括号具有最高优先级,运算顺序为 * / + - 并且从左到右。
问题是我split在括号中制作了表达式,我将一个数学运算符和一段带有数学表达式的字符串传递给函数,我将这一段传递给函数,replace并在函数中尝试捕获我传递的数学运算符及其操作数一个正则表达式并执行相应的数学运算并返回其结果而不是表达式。
该算法的本质是通过4个运算符跳过原始字符串的一部分,结果返回一个数字。对所有部分执行相同的操作。问题本身是没有replace行并且表达式返回不变。
+(function(){
var inputString = prompt("Enter a math expression here", "0");
var arrayOfMathSymbols = ['*', '/', '+', '-'];
//checking block of math expression
var splitExpression = inputString.split('');
var testArray = splitExpression.filter( function(item){
if(!isNaN(+item)) return item;
else if( /[\*\/\+\-\(\)]/g.test(item) ) return item;
});
if (testArray.length != splitExpression.length) {
alert("Please enter a correct math expressions contains numbers or * / + - ( )");
throw("Lexical error in the expression");
}
// end of the cheking block
var arrayAfterSplitOnBracket = inputString.split(/[\(\)]/g);
while(true) {
if(arrayAfterSplitOnBracket.length > 1){
for(let i = parseInt((arrayAfterSplitOnBracket / 2) - 1); i > 0;) {
arrayOfMathSymbols.forEach( function(item, i, arr) {
var resultCalculation = Calculate(item,arrayAfterSplitOnBracket[i]);
arrayAfterSplitOnBracket[i] = resultCalculation;
});
}
}
else {
arrayOfMathSymbols.forEach( function(item, i, arr) {
var resultCalculation = Calculate(item,arrayAfterSplitOnBracket[0]);
arrayAfterSplitOnBracket[0] = resultCalculation;
});
}
break;
}
//Define block of functions
function Calculate(mathSymbol, partOfMathExpression) {
let regularNote = new RegExp('[\\+\\-]?\\d+\\' + mathSymbol + '[\\+\\-]?\\d+', 'gi');
partOfMathExpression.replace(regularNote, function(str, offset, s) {
let afterSplit = str.split(mathSymbol);
switch(mathSymbol) {
case '*': return afterSplit[0] * afterSplit[1];
break;
case '/': return afterSplit[0] / afterSplit[1];
break;
case '+': return (parseInt(afterSplit[0]) + parseInt(afterSplit[1]));
break;
case '-': return afterSplit[0] - afterSplit[1];
break;
}
});
return partOfMathExpression; //для примера 1*2 после первого прохода здесь должно получится 2, но на выходе всё тоже выражение 1*2
}
}());