JavaScript Валидность математического выражения

Есть различные выражения для калькулятора: "2+1", "13-3", "10/2" и т.д. Приходят с инпута

Всего 5 знаков: (+ - * % /), чисел в выражении всего два

Написал такую функцию:

function isValidMathExpression(exp) {
    if (exp !== '') {
        try {     
            const result = eval(exp);
            return true;
        } catch (e) {
            return false;
        }
    } else {
        return false;
    }
}

Она проверяет валидность математического выражения. Но потом я прочел, что использовать eval не безопасно в инпутах, и переписал с использованием regex:

function isValidMathExpression(exp) {
    if (exp !== '') {
        try {     
            const result = /[\%\-\/\+\*]/.test(exp);
            return true;
        } catch (e) {
            return false;
        }
    } else {
        return false;
    }
}

Но теперь он только лишь проверяет на наличие знаков, т.е. при не валидном "9+", вернёт всё равно true.

Нужна помощь, для написания емкой и красивой функции для валидации математических выражений


Ответы (1 шт):

Автор решения: teran

eval() не стоит использовать, когда вы не знаете, что находится во входной строке. Если вы провалидируете строку и не допостите наличия там произвольного кода, то в целом никто не мешает вам использовать данную функцию. В вашем случае можно проверить, что строка состоит из цифр и математических знаков. Единственное, на что следует обратить внимание, что при проверке регулярки надо проверять всю строку от начала до конца, а не как у вас, на совпадение одного символа.

/^[\d\s%\/*+-]+$/
→ Ссылка