Шаблон регулярного выражения для HH: MM: SS time string

Я хочу разобрать 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 секунды [MM: SS]
  3. если вы вводите 20:30: 12 проход с 20 часов, 30 минут и 12 секунд [чч:мм:СС]
  4. если вы вводите 78: 12, не проходите 78 минут неправильно....

в основном, если один": "найден, рассмотрим число перед ": "как мм и число после ": "как SS . Если найдено два ":", рассмотрим как HH:MM:SS

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

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

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

2 ответов


^(?:(?:([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

@Tim Pietzcker охватывает требование OP для парсера HH:MM:SS, где SS был обязательным, т. е.

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

если вы позволите мне немного отклониться от требования OP и рассмотреть случай, когда HH является обязательным, т. е.

  • 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))? - необязательно соответствует секундам