首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算术表达式验证

算术表达式验证
EN

Stack Overflow用户
提问于 2019-05-16 07:05:53
回答 1查看 1.1K关注 0票数 0

是否有任何现有的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库,那么检查它是否有效的好方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)检查该表达式是否会产生一个数字结果。如果是,表达式是有效的,否则它是无效的。

代码语言:javascript
复制
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));
});

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56162646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档