Regex позволяет повторять шаблон, когда я этого не хочу - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь взять параметр запроса и проверить правильность синтаксиса, предоставленного пользователем. Регулярное выражение кажется лучшим выбором для этого, но у меня возникают проблемы с его настройкой, поэтому шаблон не позволяет повторяться.

Шаблон, который я придумал:

(^(\w+)(=|!=|>=|>|<=|<|~)((')(.*)('))(\s(AND|OR)\s)(\w+)(=|!=|>=|>|<=|<|~)((')(.*)('))$)

Синтаксис, предоставленный пользователем, должен быть следующим:

[поле] [предикат] [одинарная кавычка] [значение] [одинарная кавычка] [пробел] [логический оператор] [пробел] [ поле] [предикат] [одиночная кавычка] [значение] [одинарная кавычка]

Где:

  1. поле - [любое слово]
  2. предикат - [= | ! = | > = | > | <= | <| ~] </li>
  3. логическим оператором является [AND | ИЛИ (с пробелом с обеих сторон)]
  4. значение равно [любое слово, заключенное в одинарные кавычки]

Пример выглядит следующим образом: field1 = ' value1 'OR field2 =' value2 '

Проблема, с которой я столкнулся, заключается в том, что созданный мной шаблон допускает такие вещи:

field1 =' value1 'OR field2 =' value2field1 = 'value' OR field2 = 'value2' '[ Это не должно работать, но работает ]

field1 =' value1 'ИЛИ field2 =' value2 field1 = 'value' ИЛИ ​​field2 = 'value2' '[ Это не должно работать, но работает ]

field1 =' value1 'ИЛИ field2 =' value2 'И field3 =' value3 'ИЛИ field4 = 'value4' '[ Это не должно работать, но работает ]

Любая помощь будет принята, если шаблон повторяется.

1 Ответ

1 голос
/ 01 мая 2020

Вы можете использовать:

^\w+(?:<=|=>|!=|[~<>=])'\w+'(?: (?:OR|AND) \w+(?:<=|=>|!=|[~<>=])'\w+')*$
  • ^ Начало строки
  • \w+ Совпадение с 1 или более символами слова
  • (?: Не группа захвата
    • <=|=>|!=|[~<>=] Соответствует одной из альтернатив
  • ) Закрытая группа
  • \w+ Соответствует 1 или более словам символов между одним кавычки
  • (?: Группа без захвата
  • (?:OR|AND) \w+ Соответствие пробелу, либо AND или OR и 1+ символов слова
    • (?:<=|=>|!=|[~<>=]) Соответствие одному из альтернативы
    • \w+ Совпадение 1 или более символов слова между одинарными кавычками
  • )* Закрыть группу и повторить 0+ раз, чтобы также совпадать без AND или OR
  • $ Конец строки

Если должен быть хотя бы один AND или OR, квантификатор последней группы может быть + вместо *

Отдельные символы в предикате могут быть добавлены к классу символов [~<>=], чтобы сделать несколько изменений.

Regex demo

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