Шаблон регулярного выражения для строки времени ЧЧ:ММ:СС

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

В основном, если один ":" найден, рассматривайте число до ":" как MM и число после ":" как SS . Если найдено два символа ":", считается ЧЧ:ММ:СС

Я придумал этот узор.

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

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


person user418836    schedule 29.11.2011    source источник
comment
Для ваших требований это выглядит как удивительно простое регулярное выражение.   -  person Michael Paulukonis    schedule 30.11.2011


Ответы (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
person Tim Pietzcker    schedule 29.11.2011
comment
Большое спасибо. Это намного проще и класснее. Я хочу изучить регулярное выражение. Пожалуйста, укажите мне правильное направление. Как научиться регулярному выражению. Все, что я сейчас знаю, это базовый синтаксис (что-то вроде краткого руководства) - person user418836; 30.11.2011
comment
@user418836: Посетите www.regular-expressions.info - person Tim Pietzcker; 30.11.2011
comment
как я могу использовать это в posix c для функции regcomp. я получаю неизвестную последовательность excape в '\d' - person Aditya P; 24.02.2012
comment
@AdityaGameProgrammer: попробуйте [0-9] вместо \d. - person Tim Pietzcker; 25.02.2012
comment
Dint work .stackoverflow.com/questions/9428586/ - person Aditya P; 28.02.2012
comment
Замечательное объяснение. Если вы также хотите сопоставлять десятичные секунды, это также легко добавить: ^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)(?:\.(\d+))?$, попробуйте здесь - person bcattle; 07.03.2017
comment
Как использовать ^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d )$ шаблон в ng-шаблоне - person Rigin Oommen; 17.08.2017
comment
@bcattle вы, вероятно, имели в виду ^(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)(\.(\d{1,9}))?$ - миллисекунды обычно представлены только после точки ... если вообще - person Yordan Georgiev; 02.03.2018

@Tim Pietzcker покрывает требование OP для синтаксического анализатора ЧЧ:ММ:СС, где СС был обязательным, т.е.

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

Если вы позволите мне немного отклониться от требований ОП и рассмотреть случай, когда 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))? - опционально соответствует секундам
person Stephen Quan    schedule 03.04.2017