Шаблон регулярного выражения для временной строки ЧЧ: ММ: СС - PullRequest
36 голосов
/ 30 ноября 2011

Я хочу разобрать строку hh:mm:ss. Простым является ([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d), который ожидает 2:3:24 или 02:03:24 строку.

Я хочу сделать еще один шаг и пройти проверку даже в таких случаях, как

  1. если вы введете только 56, это должно быть пропущено, поскольку 56 можно рассматривать как 56 секунд [СС]
  2. если вы введете 2: 3 или 02:03 или 02: 3 или 2:03, оно должно пройти. 2 минуты и 3 секунды [ММ: СС]
  3. Если вы введете 20:30:12, введите 20 часов, 30 минут и 12 секунд [ЧЧ: ММ: СС]
  4. если вы введете 78:12, не пропустите 78 минут неправильно ....

Обычно, если найдено одно ":", считать число до ":" как ММ, а число после ":" как СС , Если два ":" найдены, считайте ЧЧ: ММ: СС

Я придумал этот шаблон.

(^([0-1]?\d|2[0-3]):([0-5]?\d):([0-5]?\d)$)|(^([0-5]?\d):([0-5]?\d)$)|(^[0-5]?\d$)

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

Ответы [ 2 ]

110 голосов
/ 30 ноября 2011
^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)$

Пояснение:

^                   # Start of string
(?:                 # Try to match...
 (?:                #  Try to match...
  ([01]?\d|2[0-3]): #   HH:
 )?                 #  (optionally).
 ([0-5]?\d):        #  MM: (required)
)?                  # (entire group optional, so either HH:MM:, MM: or nothing)
([0-5]?\d)          # SS (required)
$                   # End of string
6 голосов
/ 03 апреля 2017

@ Тим Питцкер покрывает требование OP для синтаксического анализатора HH: MM: SS, где SS был обязательным, т.е.

  • HH: MM: SS
  • MM: SS
  • SS

Если вы позволите мне немного отклониться от требования ОП и рассмотрите случай, когда НН является обязательным, то есть

  • HH
  • HH: MM
  • HH: MM: SS

Регулярное выражение, которое я придумал, было:

^([0-1]?\d|2[0-3])(?::([0-5]?\d))?(?::([0-5]?\d))?$

Давайте разберемся:

  • ([0-1]?\d|2[0-3]) - совпадения по часам
  • (?::([0-5]?\d))? - по выбору соответствует минутам
  • (?::([0-5]?\d))? - опционально соответствует секундам
...