今天一个朋友让帮忙写个检验四则运算式子的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;
}
暂时没发现其他“隐患”了。。。