Общее·количество·просмотров·страницы

Java Dev Notes - разработка на Java (а также на JavaScript/Python/Flex и др), факты, события из АйТи

Показаны сообщения с ярлыком regexp. Показать все сообщения
Показаны сообщения с ярлыком regexp. Показать все сообщения

вторник, 3 мая 2011 г.

Регулярное выражение для проверки списка регионов

По работе возникла необходимость написать регулярное выражение для проверки списка регионов. Регион - это последовательность из трех прописных букв английского алфавита. Т.е.
[A-Z]
Пример названий регионов: NYC, TOK, LON, SYN и т.д.

Поле ввода регионов должно содержать один или более регион, отделенный друг от друга запятыми без пробелов. Пример корректного ввода:

  • NYC

  • NYC,TOK,LON,SYN

Требуется написать регулярное выражение для проверки ввода. Это регулярное выражение будет следующим:
^([A-Z]{3},)*([A-Z]{3}$)

Наш ввод можно разделить на две группы. Одна группа - это когда в поле ввода всего лишь один регион. Пример такого ввода: NYC. Регулярное выражение для проверки следующее:
^[A-Z]{3}$
Вторая группа: список регионов, разделенный запятыми. Пример ввода: NYC,TOK,LON,SYN. Составим регулярку для проверки такого ввода.

Такую строку (NYC,TOK,LON,SYN) можно представить следующим образом: сначала идет 1 или больше регионов, после которых ставится запятая. Последний регион прибавляется в конце. После него не ставится запятая. Например, для строки NYC,TOK,LON,SYN это выглядит следующим образом: сначала идут три региона, после которых ставится запятая: NYC,TOK,LON,. Затем добавляется регион, после которого запятая не стоит: SYN.

Для такой строки NYC,TOK,LON,SYN регулярное выражение будет следующим:
([A-Z]{3},)+
Для строки SYN регулярка такова:
[A-Z]{3}
Теперь совместим эти две регулярки, и получим:
^([A-Z]{3},)+([A-Z]{3}$)
. Но это выражение требует, чтобы регионов, после которых идет запятая, было как минимум одна штука. Вспоминаем, что есть символ
*
, который значит 0 или более вхождений паттерна. Ставим * вместо +, и получаем:
^([A-Z]{3},)*([A-Z]{3}$)
что нас вполне устраивает. Ну и, разумеется, добавляем символы начала и конца строки.

пятница, 29 апреля 2011 г.

Регулярное выражение для проверки времени

Задача: написать регулярное выражение для проверки введенного времени в формате hh:mm (24-часовой формат!). Регулярное выражение следующее:
^(([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/

Постоянные читатели