Вопрос

Я хочу проанализировать 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 секунд [SS
  2. Если вы вводите 2: 3 или 02:03 или 02: 3 или 2:03, он должен пройти. 2 минуты и 3 секунды [мм: SS
  3. Если вы войдете в 20:30:12 пройти с 20 часов, 30 минут и 12 секунд [HH: MM: SS
  4. Если вы входите 78:12, не проходите 78 минут - это неправильно ....

По сути, если один ":" найдено, рассмотрите число раньше ":" как mm и номер после ":" как 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$)

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

Это было полезно?

Решение

^(?:(?:([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 Parser, где SS был обязательным, т.е.

  • HH: MM: SS
  • ММ: СС
  • SS

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

  • HH
  • HH: мм
  • 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))? - По желанию совпадает за секунды
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top