我想知道一个简单的方法来检查一个字符串是否是一个数学表达式。作为一个例子,谷歌(和其他搜索引擎)在你搜索时使用这个。
PS:我不一定要检查sin、cos等内容。
sin
cos
示例:2+2应返回true,但letters+somethingelse应返回false谢谢!
2+2
true
letters+somethingelse
false
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");
这可能需要根据您希望允许的内容进行扩展。它不处理的一件事是用括号覆盖运算符优先级。
5ktev3wc2#
使用complex-js,可以将Complex.compile() Package 在try/catch语句中:
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>
这个解析器的语法在这里,如果你有兴趣看看它支持什么结构。完全公开,我是这个图书馆的作者
voj3qocg3#
您可以使用math.js来实现这一点。对于您的情况,请使用math.evaluate(expression)如果你想检查一个表达式(包含变量)在数学上是否有效,使用math.parse(expression)。例如,math.parse('a+b')是有效的,但是math.parse('b+')会抛出异常。
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; } }
6qftjkof4#
您可以使用Regular Expressions。转到该链接以了解有关它们的更多信息。这是一个非常简单的例子,只需要检查一个数字,然后是+、-、* 或/,然后是另一个数字。您可能需要调整它并添加到它以满足您的需要。
/\d+(\+|\-|\*|\/)\d+/.test("1+2") // returns true /\d+(\+|\-|\*|\/)\d+/.test("a+b") // returns false
vltsax255#
你可以使用eval(expression)来执行它,并且你需要使用“trycatch”来 Package 代码块。如果它捕获一个错误,表达式应该是无效的
eval(expression)
5条答案
按热度按时间q3aa05251#
这里有一个正则表达式,可以做我认为你正在寻找:
https://regex101.com/r/w74GSk/4
它匹配一个数字(可以是负数)和一个可选的十进制数字,后面跟有零个或多个运算符/数字对。
它还允许在数字和运算符之间使用空格。
这可能需要根据您希望允许的内容进行扩展。它不处理的一件事是用括号覆盖运算符优先级。
5ktev3wc2#
使用
complex-js
,可以将Complex.compile()
Package 在try/catch
语句中:这个解析器的语法在这里,如果你有兴趣看看它支持什么结构。
完全公开,我是这个图书馆的作者
voj3qocg3#
您可以使用math.js来实现这一点。
对于您的情况,请使用
math.evaluate(expression)
如果你想检查一个表达式(包含变量)在数学上是否有效,使用
math.parse(expression)
。例如,math.parse('a+b')
是有效的,但是math.parse('b+')
会抛出异常。6qftjkof4#
您可以使用Regular Expressions。转到该链接以了解有关它们的更多信息。
这是一个非常简单的例子,只需要检查一个数字,然后是+、-、* 或/,然后是另一个数字。您可能需要调整它并添加到它以满足您的需要。
vltsax255#
你可以使用
eval(expression)
来执行它,并且你需要使用“trycatch”来 Package 代码块。如果它捕获一个错误,表达式应该是无效的