我有一个有效的数学表达式,它只需要用一些右括号结束,eval()就可以工作了。为此,我可以在表达式中找到未闭括号,并添加闭括号,直到未闭括号与闭括号匹配。
这是我所做的:
let expression = `3 * 1 * (4 - 1 - (5 * 9 * (2 - 6 / 5 + (4 - 1 - (5 * 9 * (2 - 6 / 5 -
(4 - 1 - (5 * 9 * (2 - 6 / 5 + (4 - 1 - (5 * 9 * (2 - 6 / 5`;
const openingParenthesisCount = (expression.match(/[(]/g) || []).length;
const closingParenthesisCount = (expression.match(/[)]/g) || []).length;
let unclosedParenthesisCount =
openingParenthesisCount - closingParenthesisCount;
try {
console.log(eval(expression));
} catch (error) {
// Append closing parentheses until all the parentheses are closed
while (unclosedParenthesisCount) {
expression += ")";
unclosedParenthesisCount--;
}
}
// Valid expression
console.log(eval(expression));
我已经使用了一个测试表达式,它可以工作,但如果表达式较长,它可能需要一些时间(但最终会显示结果)。
是否有更简单/更快的方法来实现这一点?
我建议使用String#repeat()的内置功能,并使用单循环而不是RegExp。
const openedCount = Array.from(expression).reduce(
(opened, curChar)=> {
if (curChar === '(') opened++
else if (curChar === ')') opened--
return opened
},
0
)
expression += ')'.repeat(openedCount)