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

rm5edbpk  于 2023-02-02  发布在  Java
关注(0)|答案(5)|浏览(183)

我想知道一个简单的方法来检查一个字符串是否是一个数学表达式。作为一个例子,谷歌(和其他搜索引擎)在你搜索时使用这个。

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

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

q3aa0525

q3aa05251#

这里有一个正则表达式,可以做我认为你正在寻找:

/(?:(?:^|[-+_*/])(?:\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");

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

5ktev3wc

5ktev3wc2#

使用complex-js,可以将Complex.compile() Package 在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>

这个解析器的语法在这里,如果你有兴趣看看它支持什么结构。
完全公开,我是这个图书馆的作者

voj3qocg

voj3qocg3#

您可以使用math.js来实现这一点。
对于您的情况,请使用math.evaluate(expression)
如果你想检查一个表达式(包含变量)在数学上是否有效,使用math.parse(expression)。例如,math.parse('a+b')是有效的,但是math.parse('b+')会抛出异常。

function isValidMathExpression(expr){
        try{
            math.parse(expr);
            return true;
        }
        catch(ex){
            return false;
        }
    }
6qftjkof

6qftjkof4#

您可以使用Regular Expressions。转到该链接以了解有关它们的更多信息。
这是一个非常简单的例子,只需要检查一个数字,然后是+、-、* 或/,然后是另一个数字。您可能需要调整它并添加到它以满足您的需要。

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

vltsax255#

你可以使用eval(expression)来执行它,并且你需要使用“trycatch”来 Package 代码块。如果它捕获一个错误,表达式应该是无效的

相关问题