首页 > 解决方案 > 检查数值表达式(线性)是否有效?

问题描述

有很多方法可以使用正则表达式检查字符串是否有效,并相应地使用匹配/测试匹配。我正在检查包含字母(ab)、运算符(+、-、/、*)、仅特殊字符(例如 (')'、'(') 和数字 (0-9))的表达式是否有效

我已经尝试过传统方法在字符为“(”时推送,在“)”时弹出并检查是否平衡括号。代码几乎适用于偶数运算符,但在某些情况下我落后了。提供的代码在某种程度上可能是正确的。

                      checkBalancedString(text){
                        let format = /[A-Za-z0-9]/;
                        let expression = /[+-\/*]/
                        if(text.length <=2){
                            if(format.test(text[0])){
                            return true;
                            }
                            return false;
                         }
                        for(let i=0;i<text.length;i++){
                        let stringcheck=[]
                        if(text[i]== '('){
                            stringcheck.push(text[i])
                        }

                        switch(text[i]){
                            case ')':
                            if(!stringcheck.length){
                                return false;
                            }
                            stringcheck.pop();
                            break;
                        }
                        let checkalphaformat = format.test(text[i]);
                        if(checkalphaformat){
                        let nextChar =  format.test(text[i+1]);
                        let nexttonextChar = expression.test(text[i+2])
                            if(nextChar || nexttonextChar){
                            return false
                            }
                        }else{
                            let nextChar = format.test(text[i+1]);
                            if(!nextChar){
                            return false;
                            }
                            if(text[i+2]){
                            let nextChar = format.test(text[i+2])
                            if(!nextChar){
                                return false;
                            }
                            }
                        }

                        if(!stringcheck.length){
                            return true;
                        }
                        }

                        }

简而言之,字符串应该返回有效的 where 表达式,例如: (a+b), a+b, a/9, b*5 , (e-6*(d+e)), (a+b)/(cd) 和表达式如:+, - ,-a,+a-, (a+, (a+v, e*)

当每个字符后面都跟有运算符或括号时,表达式应该是完整的,任一运算符后面只有字符,括号后面跟着唯一的字符。从当前索引(前面和后面)中不应有运算符一起,并且不应有两个字符一起

标签: javascriptvalidation

解决方案


看起来您真正想要的是检查公式的有效性,而不是检查特定类型的公式。

这是我在这种情况下使用的:

// Return true if the passed string is a valid mathematical expression
//   taking as parameter a, b, c, etc.
// Examples:
//   2*a+b*b
//   (e-6*(d+e))
//   sin(a*PI + b.length) / ( round(d) - log(c) + +("Basse Qualité"===e) )
//   for (var i=0, total=0; i<10; i++) total += pow(a,i); return total
check = function(str){
    try {
        str = str.replace(/(^|[^\."'a-zA-Z])([a-zA-Z]\w+)\b/g, function(s, p, t){
            return t in Math ? p + "Math." + t : s;
        }); 
        if (!/\breturn\b/.test(str)) str = "return ("+str+")";
        var args = "abcdefghijklmnopqrstuvwxyz".split("");
        var f = Function.apply(Function, args.concat(str));
        f.apply(null, args); // if it works for args it should be ok for numbers...
        return true;
    } catch (e) {
        console.log("error while checking formula", e, str);
        return false;
    }
}

应该适用于您的案例的基本思想:

  • 尝试Function用您的公式实例化 a 作为正文和["a", "b", ...]参数名称
  • 使用示例输入执行此函数(在我的情况下["a", "b", ...]

如果您不想要像我的示例中那样的自由,您还可以测试字符范围(如果;您不想要内联 javascript,则不必允许或̀),


推荐阅读