RegEx, чтобы проверить 24-часовой формат времени не удается - PullRequest
1 голос
/ 23 апреля 2019

У меня есть следующий RegEx, который должен выполнить проверку формата времени 24 часа, который я пробую в https://rubular.com

/^[0-23]{2}:[0-59]{2}:[0-59]{2}$/

Но следующие времена не совпадают, даже если они выглядят правильно

02:06:00
04:05:00

Почему это так?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

В классах символов вы должны обозначать диапазон символов (в отличие от чисел, которые вы хотите сопоставить в вашем примере). Для минут и секунд это относительно просто - следующее выражение

[0-5][0-9]

... будет соответствовать любой числовой строке от "00" до "59".

Но для часов нужно два отдельных выражения:

[01][0-9]|2[0-3]

... один для соответствия «00» - «19» и один для «20» - «23». Из-за используемой альтернативы (| символ) их необходимо сгруппировать, что добавляет еще один бит синтаксиса (?:...). Наконец, мы просто добавляем якоря ^ и $ для начала и конца строки, которые у вас уже были, где они принадлежат.

^(?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$

Вы можете проверить это решение на regex101 , если хотите.

2 голосов
/ 23 апреля 2019

Ваша проблема в том, что вы неправильно понимаете диапазоны символов: 0-23 не означает "соответствует любому числу от 0 до 23", это означает: 0-2 - соответствует одной цифре: 0,1 или 2, затем соответствует 3.

Попробуйте этот шаблон: (?:[01][0-9]|2[0-3])(?::[0-5][0-9]){2}

Объяснение:

(?:...) - группа без захвата

[01][0-9]|2[0-3] - чередование: соответствует ли0 или одна, за которой следуют любые цифры от 0 до 9 ИЛИ 2, за которыми следуют 0, 1, 2 или 3 (число от 00-23)

(?::[0-5][0-9]){2} - совпадение : и[0-5][0-9] (в основном число от 00-59) дважды

Демо

1 голос
/ 23 апреля 2019

используйте это (([0-1]\d|[2][0-3])):(([0-5][0-9])):(([0-5][0-9]))

Онлайн демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...