我想知道检查字符串是否是数学表达式的简单方法。 例如,Google(和其他搜索引擎)在您搜索时会使用此功能。
PS :我不一定要查看sin
,cos
等内容。
示例:2+2
应返回true
,但letters+somethingelse
应返回false
谢谢!
答案 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;
如果您对查看它支持的构造感兴趣,则此解析器的语法为here。
完全披露,我是这个图书馆的作者
答案 2 :(得分:0)
您可以使用Regular Expressions。转到该链接以了解有关它们的更多信息。
这是一个非常简单的例子,只检查一个数字,然后是+, - ,*,或/然后是另一个数字。您需要调整它并添加它以满足您的需求。
/\d+(\+|\-|\*|\/)\d+/.test("1+2") // returns true
/\d+(\+|\-|\*|\/)\d+/.test("a+b") // returns false