Помогите написать регекс для валидации строки математического выражения
re.test(str) должен вернуть true если строка состоит только из чисел и знаков ×÷+-. + и - могут идти друг за другом например 5+-2 или 5-+2, но +,- не могут идти сразу до ×,÷ (могут только после). И ×÷ тоже не могут идти друг за другом. В общем все как в математике.
'5+-3÷2' // true
'5×÷4+2' // false
'5/-5' // true
'5-/5' // false
Ответы (5 шт):
let math_check = exp => !(/[\^*%+/÷-]+(?=[\^*%/÷]+)/.test(exp));
console.log(math_check("^^5*÷6*555*7")); // false
console.log(math_check("5+1--1")); // true
console.log(math_check("6-/68")); // false
Регексп использует опережающую проверку. "Найти X, после которого следует Y" В данном случае, найти арифметический оператор, после которого следует другой, который этого не может делать. Как то так.
Простейшее регулярное выражение, которое пришло в голову.
const re = /^([-+]?\d+[-+×÷]?)*[-+]?\d+$/;
console.log(re.test('5+-3÷2')); // true
console.log(re.test('5÷-4+2')); // true
console.log(re.test('5×÷4+2')); // false
console.log(re.test('5/-5')); // false
console.log(re.test('5÷-5')); // true
console.log(re.test('5-/5')); // false
console.log(re.test('5-÷5')); // false
Унарные операции привязываем к числу, а после числа требуем конец строки или бинарный оператор:
const re = /^(([-+]*\d+)($|[-+×÷](?!$)))*$/;
console.log(re.test('5+-3÷2')); // true
console.log(re.test('5÷-4+2')); // true
console.log(re.test('5×÷4+2')); // false
console.log(re.test('5/-5')); // false
console.log(re.test('5÷-5')); // true
console.log(re.test('5-/5')); // false
console.log(re.test('5-÷5')); // false
Возможно, не очень эффективно, зато интересно тем, что тут именно исключаются запрещённые сочетания, а не формируются разрешённые:
const re = /^(?!.*(\D[×÷]))(?=.*\d)[-+×÷\d]+$/;
console.log(re.test('5+-3÷2')); // true
console.log(re.test('5÷-4+2')); // true
console.log(re.test('5×÷4+2')); // false
console.log(re.test('5/-5')); // false
console.log(re.test('5÷-5')); // true
console.log(re.test('5-/5')); // false
console.log(re.test('5-÷5')); // false
я думаю что вам нужно только указать неправильные выражения разделены по символа | и экранировать символы как / и * с \ например:
"-\/|\/\*|\*\/"
найдет
-/, /*, */
в тексте:
5+2-/3/*8*/6