Проверить числовое выражение (линейное) допустимо или нет? - PullRequest
0 голосов
/ 28 мая 2019

Есть много способов проверить правильность строки или не использовать выражение регулярного выражения и соответственно использовать совпадение / тестовое совпадение.Я проверяю, является ли действительным выражение, содержащее буквы (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;
                        }
                        }

                        }

В короткой строке должен возвращаться допустимый, где выражение, как: (a + b), a + b, a / 9, b * 5, (e-6 * (d + e)), (a + b) / (cd) и выражение, подобное: +, -, -a, + a-, (a +, (a + v, e *)

Выражение должно быть завершено, когда за каждым символом следует оператор или скобка, либо за оператором следуют только символы, а в скобках - только символ. Не должно быть ни одного оператора из текущего индекса (спереди и сзади) и двух символоввместе

1 Ответ

1 голос
/ 28 мая 2019

Похоже, что вы действительно хотите проверить правильность формулы больше, чем проверить конкретный вид формулы.

Вот что я использую в таком случае:

// 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", "b", ...] в качестве имен аргументов
  • выполнить эту функцию с вводом образца (в моем случае ["a", "b", ...])

Если вы не хотите такой свободы, как в моем примере, вы можете также проверить диапазоны символов (вам не нужно разрешать ; или ̀ ,, если вы не хотите встроенный JavaScript)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...