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;
}暂时没发现其他“隐患”了。
来自:https://www.cnblogs.com/vwvwvwgwg/p/12892278.html
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!