Сложное регулярное выражение не проверяет все повторения одного конкретного правила - PullRequest
0 голосов
/ 24 января 2019

Мне нужна помощь для проверки поля с помощью регулярных выражений.Он будет работать в Postgres 9.5.

Правила:

  • Строка должна содержать все семь служб: масло, щетки стеклоочистителя, воздушный фильтр, шины, аккумулятор, Тормоз, Антифриз
  • Все сервисы должны иметь часы работы, и принимаются значения HH [: MM] {am | pm} -HH [: MM] {am | pm} илилитералы «рабочее время», «в нерабочее время», «недоступно» (это правило, которое я не мог найти решение)
  • Это без учета регистра, и пробелы не должны иметь значения.
  • Службы, разделенные конвейером, а служба и рабочее время разделены двоеточием

Я сделал регулярное выражение:

^(?=.*(Oil))(?=.*(Wiper blades))(?=.*(Air filter))(?=.*(Tires))(?=.*(Battery))(?=.*(Brake))(?=.*(Antifreeze))(?=.*(\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)\s{0,}-\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)|working hours|after hours|not availabl)).+

Эта частьрегулярного выражения проверяет только одну последовательность, а не все семь последовательностей.

(?=.*(\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)\s{0,}-\s{0,}(1{0,1}[0-2]|[1-9])(:[0-5][0-9]){0,1}\s{0,}([ap]m)|working hours|after hours|not availabl))

Пример хорошей строки

Oil:8AM-10PM|Wiper blades:8 AM -10 PM|Air filter:8AM-10pm|Tires:8AM-10PM|Battery:8AM-10PM|Brake:8AM-9PM|Antifreeze:not available

Пример плохой строки

Oil:8AM-10PM|Wiper blades:8AM-10PM|Air filter:8AM-10PM|Tires:8AM-10PM|Battery:8AM-10PM|Brake:8AM-9PM|Antifreeze:fsdfdsfs

Oil:8AM-10PM|Wiper blades:8AM-10PM|Air filter:8AM|Tires:8AM-10PM|Battery:8AM-10PM|Brake:8AM-9PM|Antifreeze:

Oil:8AM-10PM|Wiper blades:8AM-10PM|Air filter:8AM-10PM|Tires:8AM-10PM|Battery:|Brake:|Antifreeze:8AM-9PM

Oil:8AM-10PM|Wiper blades:8AM-10PM

Кто-нибудь имеет представление о том, что не хватает для проверки семи случаев?

1 Ответ

0 голосов
/ 24 января 2019

Я сделал еще одно регулярное выражение, которое работает:

^(((oil|Air\ filter|Wiper\ blades|Tires|Battery|Brake|Antifreeze):((((\d{1,2})((A|P)M)(-?)){2})|(not available))(\|?)){7})$


Как бы то ни было, это регулярное выражение не учитывает количество повторений.Это значит, что у вас может быть нефть два раза, пока она все еще работает.
Я создал regex101 , если вы хотите проверить больше случаев.

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