检查字符串是否是JavaScript中的数学表达式

时间:2018-02-27 18:44:42

标签: javascript

我想知道检查字符串是否是数学表达式的简单方法。 例如,Google(和其他搜索引擎)在您搜索时会使用此功能。

PS :我不一定要查看sincos等内容。

示例:2+2应返回true,但letters+somethingelse应返回false

谢谢!

3 个答案:

答案 0 :(得分:3)

这是一个可以做我认为你正在寻找的正则表达式:

/(?:(?:^|[-+_*/])(?:\s*-?\d+(\.\d+)?(?:[eE][+-]?\d+)?\s*))+$/

https://regex101.com/r/w74GSk/4

它匹配一个数字,可选择为负数,可选的十进制数后跟零个或多个运算符/数字对。

它还允许数字和运算符之间的空格。



const re = /(?:(?:^|[-+_*/])(?:\s*-?\d+(\.\d+)?(?:[eE][+-]?\d+)?\s*))+$/;

function test(s) {
  console.log("%s is valid? %s", s, re.test(s));
}

// valid
test(" 1 ");
test("1 + 2");
test(" 1 * 2 * 3 ");
test("-1 * 2 - -3");
test("-1 * 2 - -3e4");
test("-1 * 2 - -3.5E6");

// invalid
test("1 +");
test("1 + foo");




这可能需要根据您要允许的内容进行扩展。它没有处理的一件事是括号来覆盖运算符优先级。

答案 1 :(得分:1)

使用complex-js,您可以将Complex.compile()括在try/catch语句中:



function isMathExpression (str) {
  try {
    Complex.compile(str);
  } catch (error) {
    return false;
  }
  
  return true;
}

console.log(isMathExpression('2+2'))
console.log(isMathExpression('foo+bar'))
console.log(isMathExpression('sin(5)+sqrt(2/5i)'))

<script src="https://unpkg.com/complex-js@5.0.0/dst/complex.min.js"></script>
&#13;
&#13;
&#13;

如果您对查看它支持的构造感兴趣,则此解析器的语法为here

完全披露,我是这个图书馆的作者

答案 2 :(得分:0)

您可以使用Regular Expressions。转到该链接以了解有关它们的更多信息。

这是一个非常简单的例子,只检查一个数字,然后是+, - ,*,或/然后是另一个数字。您需要调整它并添加它以满足您的需求。

/\d+(\+|\-|\*|\/)\d+/.test("1+2") // returns true
/\d+(\+|\-|\*|\/)\d+/.test("a+b") // returns false