用Java脚本替换数学表达式字符串进行求值获胜't替换所有**事件

Replacing math expression String for evaluating with Java Script won't replace all ** incidences

本文关键字:替换 获胜 事件 脚本 Java 表达式 字符串      更新时间:2023-09-26

我试图解析一个数学表达式,以便使用.eval对其求值。

我编码:

function evaluarExpresion (fx, x) {
    fx = fx.replace("x", x)
    fx = fx.replace("e", "Math.E")
    fx = fx.replace("sin", "Math.sin")
    fx = fx.replace("tan", "Math.tan")
    fx = fx.replace("cos", "Math.cos")
    fx = fx.replace("pi", "Math.PI")
    fx = fx.replace("**", "^")
    return eval(fx)
}

但是,当使用(1^3)/(1+x**(1/2))调用时,它将失败,因为replaces语句只将fx字符串变成:

'(1^3)/(1+x**(1/2))'

因此eval语句抛出:

Uncaught SyntaxError: Unexpected token *

我该如何解决这个问题,或者用数字计算这些表达式(三角函数、sqrt、e、pi等)的最佳替代方案(任何库)是什么?

您必须将搜索字符串更改为模式才能使用g(全局搜索)选项:

function evaluarExpresion (fx, x) {
    fx = fx.replace(/x/g, x)
    fx = fx.replace(/e/g, "Math.E")
    fx = fx.replace(/sin/g, "Math.sin")
    fx = fx.replace(/tan/g, "Math.tan")
    fx = fx.replace(/cos/g, "Math.cos")
    fx = fx.replace(/pi/g, "Math.PI")
    fx = fx.replace(/'*'*/g, "^")
    return eval(fx)
}
console.log(evaluarExpresion('(1**3)/(1+x**(1/2))' , 9));

您可以使用math.js的表达式解析器,如:

var math = mathjs();
var result = math.eval('(1^3)/(1+x^(1/2))', {x: 16}); // 0.2

有一点:math.js目前缺少您在示例中使用的按位操作。我不确定在您的例子中,您是否真的打算进行逐位运算,或者打算进行幂运算。