^(([0,1][0-9])|(2[0-3])):[0-5][0-9]$
Теперь давайте разберем его "по косточкам".
Итак, время в 24-часовом формате может принимать, например, следующие значения: 06:00, 11:15, 23:59 и т.д. Первые две цифры (hh) обозначают часы с ведущим нулем (т.е. пишем 06, а не 6). Значение часов может быть от 0 (т.е. 00) до 23. Поэтому мы пишем следующее выражение:
[0,1][0-9]- что означает, что первый символ может быть 0 или 1, а следующий символ может принимать значение от 0 до 9 (т.е. любая цифра). т.е. любые значения от 00 до 19 подходят под эту регулярку.
Теперь рассмотрим значения часов от 20 до 23. Если первый символ - двойка, то следующий символ может быть цифрой от 0 до 3. Это нас приводит к выражению
2[0-3]- под него подходят числа 20, 21, 22, 23. Объединяя эти два выражения (с помощью логического "ИЛИ" - |)для часов, получаем первую часть нашей регулярки (для проверки только часов):
([0,1][0-9])|(2[0-3])
Идем дальше: теперь нужно поставить двоеточие и проверять минуты. Первую часть регулярки (проверка часов) заключим в круглые скобки и после них поставим двоеточие:
(([0,1][0-9])|(2[0-3])):(здесь_будет_проверка_минут)
С минутами все просто - минуты принимают значение от 0 (т.е. 00) до 59. Мы это опишем следующей регуляркой:
[0-5][0-9]Смысл регулярки таков: первый символ принимает значения от 0 до 5, а второй символ - от 0 до 9 (т.е. любая цифра).
Надо отметить, что конечная версия регулярки выглядит так:
^(([0,1][0-9])|(2[0-3])):[0-5][0-9]$, т.е. имеются символы начала и конца строки (^ и $, соответственно), которые мы еще не разобрали. Рассмотрим их.
Если бы не было символа начала строки, т.е. регулярное выражение выглядело бы следующим образом:
(([0,1][0-9])|(2[0-3])):[0-5][0-9], то тогда проходили бы валидацию следующие строки: abc23:50, здесь был Вася в 16:40 и т.п. Символ начала строки позволяет указать, что сравнение с образцом должно начинаться с начала строки.
Аналогично с символом конца строки: $. Если бы его не было, т.е. регулярное выражение выглядело бы следующим образом
^(([0,1][0-9])|(2[0-3])):[0-5][0-9]то тогда валидацию бы проходили следующие строки: 12:15 - время обеда, 13:10 eeeee и так далее. Использование символа конца строки позволяет эти строки отсечь.
Регулярные выражения - очень мощный инструмент, которым нужно уметь пользоваться.
См. библиотеку регулярных выражений: http://www.regxlib.com/DisplayPatterns.aspx
См. также онлайн-тестер регулярных выражений: http://regexpr.ru/
Спасибо
ОтветитьУдалитьА почему нельзя вместо (([0,1][0-9])|(2[0-3])) написать [0-2][0-3]?
ОтветитьУдалить