是否有任何现有的javascript库将返回true或false,取决于算术表达式是否有效?
下面是一些示例:
正如您在我的示例中所看到的,由于表达式尚未完成,数字5将返回false,对于数字6,也将返回false,因为a和b之间没有操作,因此它们无效。
如果没有javascript库,那么检查它是否有效的好方法是什么?
发布于 2019-05-16 08:20:28
一种解决方案是利用javascript的eval函数。在下面的isValid函数中,我执行以下操作:
1)在表达式的两边添加一个空格(使regex匹配更容易)。
2)在任何多个字母的字符串前加上Math.,这会将ceil(1.5)之类的内容更改为Math.ceil(1.5)。否则,javascript会抱怨没有定义ceil。
3)将不属于多个字母字符串的所有字母替换为1。否则,javascript会抱怨没有定义像x这样的东西。
4)检查该表达式是否会产生一个数字结果。如果是,表达式是有效的,否则它是无效的。
function isValid(origExp) {
const exp = (' ' + origExp + ' ')
.replace(/([a-z]{2,})/gi, 'Math.$1')
.replace(/([^a-z])[a-z]([^a-z])/gi, '$11$2')
.replace(/([^a-z])[a-z]([^a-z])/gi, '$11$2');
try {
return !isNaN(eval(exp));
} catch (e) {
return false;
}
}
const expressions = [
'abs((x + y) * 2)',
'ceil(x)',
'x / y + 2',
'x/y+2',
'a + 10 /', //invalid
'a b + 4', //invalid
'abs((x + y) * ceil(2.5)) + A*b/c-d+e',
'abs((x + y) * ceil(2.5)) + A*b/c-de', //invalid
'abs((x + y) * ceil(2.5)) + A*b/c-d(e)', //invalid
'abs((x + y) * ceil(2.5)) + A*b/c-d(+e)', //invalid
'abs((x + y) * ceil(2.5)) + A*b/c-d+(e)'
];
expressions.forEach(exp => {
console.log(exp, isValid(exp));
});
https://stackoverflow.com/questions/56162646
复制相似问题