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

摘要:是可以通过检验的,并且在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


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_8999