在运行于Node.js的科学软件包中,我需要执行用户提供的数学表达式,例如“ sin(2 * PI * x)”。目前,它的实现方式类似于:
// from input: s = "1+Math.sin(2*Math.PI*x)";
...
// regexp to verify "s" doesn't contains dangerous characters as '";
...
val f = new Function( 'x', s );
...
f(12);
问题是用户必须键入Math.sin(3*x)
而不是更简单的sin(3*x)
。有什么办法可以跳过这个问题?
如果不可能,我将寻找一个“替换”调用,该调用从1+Math.sin(3*x)
构造字符串1+sin(3*x)
。
答案 0 :(得分:1)
您可以查看Math
是否具有相同名称的属性,并将其替换为其他Math.
。
var string = "sin(3*x)+foo()+PI*Math.PI",
result = string.replace(/[a-z][\d.a-z]*(?=\(|[^\da-z]|$)/ig, k => (k in Math ? 'Math.' : '') + k);
console.log(result);