Проблема в том, что вы определили, что вам нужно любое число из них, и вам нет дела до позиции. Таким образом, строка 1 aaa ( 2 or 3 )
соответствует 1
, а также
(пробел), (
, 2
, and
, 3
, )
, поэтому она удовлетворяет регулярному выражению. Тот факт, что есть aaa
, который не соответствует, игнорируется, когда есть другие вещи, которые соответствуют.
Однако, если вы используете начальный и конечный якоря ^
и $
, это определяет, что ваш весь вход должен соответствовать этому шаблону в отличие от любых вложенных элементов. часть, которая именно то, что вы хотите:
const regex = /^(\d|and|or|not|\(|\)|\s)*$/;
console.log(regex.test("1 and ( 2 or 3 )")); // true
console.log(regex.test("1 aaa ( 2 or 3 )")); // false