RegEx для сопоставления дней часов минут с пробелами - PullRequest
1 голос
/ 18 марта 2019

Мне нужно убедиться, что введенные пользователем отметки времени равны
(от 0 до бесконечности) дней (от 0 до 23) часов (h до 59) минут

с пробелами между ними, поэтому хороший пример:

  • 22ч 40м
  • 2д 20м
  • 1d

, но не

  • 0d
  • 2d22h20m

что у меня до сих пор есть:

^(0|[1-9][0-9]*d)?( [0|[1-5][0-9]*h)?(0| [1-5][0-9]*m)?$

, что дает:

  • 22d 3h 40m
  • 2d 40m

но не

  • 40m
  • 40h

это кажется тривиальным, и я написал его изнесколько вопросов SO, но ничто не соответствует точно этому.

Редактировать
просто обратите внимание, что моя первоначальная попытка содержит ошибку, которая допускает 1-59 часов .

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Это довольно многословно, но одним из вариантов может быть использование чередования и перечисление всех допустимых возможностей, используя ваши шаблоны для d, h и m.

Соответствие (d h m) или (d h) или (d m) или (h m) или (d) или (h) или (m) вы можете использовать:

^(?:[1-9][0-9]*d (?:2[0-3]|1[0-9]|[1-9])h (?:[1-5][0-9]|[1-9])m|[1-9][0-9]*d (?:(?:2[0-3]|1[0-9]|[1-9])h|(?:[1-5][0-9]|[1-9])m)|(?:2[0-3]|1[0-9]|[1-9])h (?:[1-5][0-9]|[1-9])m|[1-9][0-9]*d|(?:2[0-3]|1[0-9]|[1-9])h|(?:[1-5][0-9]|[1-9])m)$

regex101 demo

Это будет соответствовать:

  • ^ Начало строки
  • (?: Группа без захвата
    • [1-9][0-9]*d (?:2[0-3]|1[0-9]|[1-9])h (?:[1-5][0-9]|[1-9])m Соответствует полной части
    • | или
    • [1-9][0-9]*d Совпадение d
    • (?: Группа без захвата
      • (?:2[0-3]|1[0-9]|[1-9])h Совпадение h
      • | или
      • (?:[1-5][0-9]|[1-9])m Совпадение m
    • ) закрыть группу без захвата
    • | или
    • (?:2[0-3]|1[0-9]|[1-9])h (?:[1-5][0-9]|[1-9])m Совпадение h и m
    • | или
    • [1-9][0-9]*d Совпадение d
    • | или
    • (?:2[0-3]|1[0-9]|[1-9])h Совпадение h
    • | или
    • (?:[1-5][0-9]|[1-9])m Маха m
  • ) Закрыть группу без захвата
  • $ Конец строки
0 голосов
/ 19 марта 2019

Редактировать Единственные предложения (пока) - это перечислить все возможности. Так что я буду делать это здесь ... просто обратите внимание, что моя первоначальная попытка имеет ошибку, которая позволяет 1-59 часов. regex101

^((([1-9][0-9])d (2[0-3]|1[0-9]|[1-9])h ([1-5][0-9]|[1-9])m)|(([1-9][0-9])d (2[0-3]|1[0-9]|[1-9])h)|(([1-9][0-9])d ([1-5][0-9]|[1-9])m)|((2[0-3]|1[0-9]|[1-9])h ([1-5][0-9]|[1-9])m)|([1-9][0-9])d|(2[0-3]|1[0-9]|[1-9])h|([1-5][0-9]|[1-9])m)$

означает: (d h m) или (d h) или (d m) или (h m) или (d) или (h) или (m)

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