js 检验四则运算字符串是否合法

今天一个朋友让帮忙写个检验四则运算式子的js正则表达式,写了一会儿发现有点难。。。

于是想到了这个办法:


function check(str){
    try{ str = str.replace(/ /g,''); if( /^[\d|\-|\+|\*|\/|\.|\(|\)]+$/.test(str) ){ var val = eval(str); if(typeof val == 'number' && val != Infinity){ return true; } } }catch(e){ //console.log(e) } return false; }

先通过正则筛掉四则运算不会出现的字符,再利用“几乎所有编程语言都可以直接执行四则运算”的“特性”和js的eval函数来实现,

效果还可以,可能存在的“隐患”是,这些字符如果能组成符合js语法但不是数学式子的字符串。

比如像

1+--+-+-1 

是可以通过检验的,并且在js中也是按数学表达式计算结果的, 但是这个算不算“合格”的数学表达式呢?

这个就看具体情况了吧,要规避也比较简单

/[\-|\+|\*|\/]{2,}/.test(str)  

可以检测连续出现的运算符

还有一个情况是,0.5 在js中可以简写为 .5  ,再加一条正则解决这个问题

 /\D\./.test(str)

检测 . 前面是否是非数字 

所以合起来就是: 


function check(str){
    try{ str = str.replace(/ /g,''); if( /^[\d|\-|\+|\*|\/|\.|\(|\)]+$/.test(str) ){ //解决连续的运算符 if(/[\-|\+|\*|\/]{2,}/.test(str))return false; //解决 0.5 简写成 .5 if(/\D\./.test(str))return false; var val = eval(str); if(typeof val == 'number' && val != Infinity){ return true; } } }catch(e){ //console.log(e) } return false; }

暂时没发现其他“隐患”了。。。

 来源: 南通网站优化

猜你喜欢

转载自www.cnblogs.com/vwvwvwgwg/p/12892278.html