我可以用JavaScript数学对象计算一个算术表达式作为字符串吗?

我可以用JavaScript数学对象计算一个算术表达式作为字符串吗?,javascript,Javascript,如果我有一个作为字符串2+3*4/5的算术表达式,有没有一种方法可以在不解析整个字符串的情况下使用JavaScript数学对象来计算它 编辑:现在,我只关心使用操作顺序支持+-*/。如果我们能拼凑出一个正则表达式来解决安全问题,我愿意进行eval。您可以使用一些正则表达式解析来检查字符串中是否没有任何错误,然后进行eval 通过简单的算术运算,安全的正则表达式应该是: s.match(/^[-*/+0-9]+$/) 请注意,这不会验证表达式在操作数和运算符方面是否平衡,即它可以+2*,但它会停

如果我有一个作为字符串2+3*4/5的算术表达式,有没有一种方法可以在不解析整个字符串的情况下使用JavaScript数学对象来计算它


编辑:现在,我只关心使用操作顺序支持+-*/。如果我们能拼凑出一个正则表达式来解决安全问题,我愿意进行eval。

您可以使用一些正则表达式解析来检查字符串中是否没有任何错误,然后进行eval

通过简单的算术运算,安全的正则表达式应该是:

s.match(/^[-*/+0-9]+$/)

请注意,这不会验证表达式在操作数和运算符方面是否平衡,即它可以+2*,但它会停止任何奇怪的代码注入。

您可以使用一些正则表达式解析来检查字符串中是否没有任何错误,然后进行求值

通过简单的算术运算,安全的正则表达式应该是:

s.match(/^[-*/+0-9]+$/)

注意,这不会验证表达式在操作数和运算符方面是否平衡,也就是说,它可以+2*,但它会停止任何奇怪的代码注入。

eval应该足够了,但我会对此保持警惕。不过,没有其他内置解决方案。为了好玩,我用JavaScript为这种算术表达式创建了一个非常简单的解析器。完整资料来源:

基本机制是在每个操作符上按优先级从低到高的顺序进行拆分,然后递归地计算每个块,在基础级别使用parseInt,并结合使用拆分中的操作符对结果进行简单的数组缩减。下面是核心函数sum、negasum、divident和product,它们只是每个操作符的数组reduce函数:

 calc = function(input) {
    if (input.indexOf("+") >= 0) {
      return sum(input.split("+"));
    } else if (input.indexOf("-") >= 0) {
      return negasum(input.split("-"));
    } else if (input.indexOf("*") >= 0) {
      return product(input.split("*"));
    } else if (input.indexOf("/") >= 0) {
      return dividend(input.split("/"));
    } else {
      return parseInt(input, 10);
    }
 };
仅支持正整数,不支持parens

控制台中示例的结果:

  calc("2+3*4/5") -> 4.4
  eval("2+3*4/5") -> 4.4

评估应该足够了,但我会小心的。不过,没有其他内置解决方案。为了好玩,我用JavaScript为这种算术表达式创建了一个非常简单的解析器。完整资料来源:

基本机制是在每个操作符上按优先级从低到高的顺序进行拆分,然后递归地计算每个块,在基础级别使用parseInt,并结合使用拆分中的操作符对结果进行简单的数组缩减。下面是核心函数sum、negasum、divident和product,它们只是每个操作符的数组reduce函数:

 calc = function(input) {
    if (input.indexOf("+") >= 0) {
      return sum(input.split("+"));
    } else if (input.indexOf("-") >= 0) {
      return negasum(input.split("-"));
    } else if (input.indexOf("*") >= 0) {
      return product(input.split("*"));
    } else if (input.indexOf("/") >= 0) {
      return dividend(input.split("/"));
    } else {
      return parseInt(input, 10);
    }
 };
仅支持正整数,不支持parens

控制台中示例的结果:

  calc("2+3*4/5") -> 4.4
  eval("2+3*4/5") -> 4.4

eval看起来很完美。出于安全原因,在线上是否有任何可靠的预写正则表达式行可供解析?我不是正则表达式大师。你的表达式有多复杂?你需要用这些数学公式吗。常数或函数,如PI、sqrt?在你的问题中指定,我会更新,我相信其他人也会。eval看起来很完美。出于安全原因,在线上是否有任何可靠的预写正则表达式行可供解析?我不是正则表达式大师。你的表达式有多复杂?你需要用这些数学公式吗。常数或函数,如PI、sqrt?在你的问题中指定,我会更新,我相信其他人也会更新。