2015-02-18 2 views
-4

Я пытаюсь совместить hh: mm: ss, но hh part является необязательным, и мне нужны только цифры для захвата групп.Регулярное совпадение для hh: mm: ss

Например, мои данные

  • 1:04:12
  • 43:32
  • 12:11

Regex вывод должен быть [1,04,12] , [43,43] и [12,11]

+3

Разве не легче «взорваться» (':', $ input), а затем проверить количество возвращенных частей и проверить их отдельно? 'regex' - не совсем правильный инструмент для проверки того, принадлежит ли значение предоставленному диапазону значений. – axiac

+4

Вы указали требования и ожидаемый результат. Итак, какова проблема/вопрос, возникший в вашем собственном решении? –

+1

На каком языке вы работаете? –

ответ

2
(?:(\d{1,2}):)?(\d{2}):(\d{2}) 

http://rubular.com/r/aWlTwgJKVn

Regular expression visualization

Debuggex Demo

Чтобы запретить минуты и секунды> = 60 Изменение этого регулярного выражения

(?:(\d{1,2}):?)([0-5]\d):([0-5]\d) 

немного проще будет это регулярное выражение, но это также соответствует времени, как 412:35 с a отсутствует :

(\d{0,2}):?(\d{2}):(\d{2}) 
+0

Это то, что я придумал, но в вашей рублевой ссылке совпадение 2 возвращает значение nil для первой части. Разве дело не в том, чтобы не захватить часть, чтобы не получить эту группу? – user3754582

+0

Получение значения nil делает ваш результат более последовательным, поскольку у вас есть опция 'hh' в group1 и' mm' всегда group2, 'ss' всегда group3. В противном случае результат будет довольно неприятным для интерпретации ... –

Смежные вопросы