算术表达式验证

时间:2019-05-16 07:05:54

标签: javascript

是否存在任何现有的javascript库,它们会根据算术表达式是否有效而返回true或false?

以下是一些示例:

  1. abs((x + y)* 2):是
  2. ceil(x):是
  3. x / y + 2:是
  4. x / y + 2:是
  5. a + 10 /:错误
  6. a b + 4:假

在我的示例中可以看到,数字5将返回false(因为表达式未完成),数字6也将返回false(因为a和b之间没有任何运算,因此它们无效)。

如果没有为此提供的JavaScript库,那么检查它是否有效的好方法是什么?

1 个答案:

答案 0 :(得分:0)

一种解决方案是利用javascript的eval函数。在下面的isValid函数中,执行以下操作:

1)在表达式的两侧添加一个空格(使正则表达式匹配更容易)。

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));
});