Регулярные выражения (Regular expressions, или просто regexp) — механизм, который позволяет осуществлять сложный поиск подстроки по заданному шаблону. Вот как раз о шаблонах мы и поговорим сегодня.
Специальные символы
// Начало текста
^
// Конец текста
$
// Любой единичный символ
.
// Количество совпадений 0 или 1. То же самое, что и {0,1}.
?
// Любое количество совпадений или их отсутствие. То же самое, что и ({0,}).
*
// Как минимум одно повторение. То же самое, что и ({1,}).
+
// Совпадения от m до n включительно.
{m,n}
// Нижняя граница совпадений.
{m,}
// Верхняя граница совпадений.
{,n}
Сложно? Ниже есть примеры, по ним будет все понятно.
Метасимволы
// Цифра (0-9)
d
// Не цифра (любой символ кроме символов 0-9)
D
// Пустой символ (пробел и табуляция)
s
// Непустой символ (все, кроме символов, определяемых метасимволом s)
S
// "Словесный" символ (все буквы, цифры и подчеркивание ('_'))
w
// Все, кроме символов, определяемых метасимволом w
W
// Символ на границе слова (в начале или в конце)
b
// Символ внутри слова
B
Группы и просмотр
// Простая группа с захватом.
( )
/* Группа без захвата.
Выражение: про(?:фессиональное|движение);
Результат: Найдены оба слова.
*/(?: )
/* Группа с положительной опережающей проверкой.
Выражение: говор(?=ит);
Результат: Найдено только слово "говорит" (еще нашло бы "говор").
*/(?= )
/* Группа с положительной опережающей проверкой.
Выражение: говор(?!ит);
Результат: Найдено "говорю", "говори", но не "говорит".
*/(?! )
/* Группа с положительной ретроспективной проверкой.
Выражение: (?<=об)говорить;
Результат: Найдено «говорить» и «обговорить», но не «уговорить».
*/(?<= )
/* Группа с отрицательной ретроспективной проверкой.
Выражение: (?<!об)говорить;
Результат: Найдено «говорить» и «уговорить», но не «обговорить».
*/(?<! )
Грубо говоря все сводится к следущей форме:
^([разрешенные и запрещеные символы]{количество повторений})$
Готовые шаблоны
Поиск email в строке
Регулярное выражение для поиска email
^([a-z0-9_.-]+)@([a-z0-9_.-]+).([a-z.]{2,6})$
Разбор
-
^
— начало строки; -
([a-z0-9_.-]+)
— группа, состоящая из символов от a до z, цифр, нижнего подчеркивания, точки или тире, которые повторяются хотя бы один раз (+); -
@
— собачка, куда же без нее в email; -
([a-z0-9_.-]+)
— разобрали уже чуть выше; -
.
— самая обычная точка. Между доменами второго и первого уровня; -
([a-z.]{2,6})
— доменная зона. Символы от a до z или точка, которые повторяются от 2 до 6 раз; -
$
— конец строки.
Кроме того, после обработки можно будет обратиться к найденным группам
$1
(username),
$2
(домен второго уровня),
$3
(доменная зона).
Поиск url в строке
Регулярное выражения для поиска url в строке
^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w.-]*)*/?$
Разбор
-
^
— начало строки; -
(https?://)?
— ищем http, следующий символ s, но он может и отсутствовать. Далее двоеточие, два заэкранированных слеша. Однако этого может и не быть; -
([da-z.-]+)
— цифры, латинский алфавит, точки и тире в каких-угодно количествах; -
.
— самая обычная точка. Между доменами второго и первого уровня; -
([a-z.]{2,6})
— доменная зона. Символы от a до z или точка, которые повторяются от 2 до 6 раз; -
([/w.-]*)*/?
— слеш и любые алфавитные символы, включая точки и тире в каких угодно количествах, которые могут повторяться от 0 до бесконечности. Кроме того это может заканчиваться слешем, а может и нет, поэтому «?»; -
$
— конец строки.
Кроме того, после обработки можно будет установить адрес главной страницы (
$1
,
$2
и
$3
), а в остальных переменных будет адрес страницы.
Поиск даты в строке
Регулярное выражение для поиска даты в строке
^d{1,2}([-. /])d{1,2}1d{2,4}$
Разбор
-
^
— начало строки; -
d{1,2}
— любое число от одного до двух разрядов (день); -
([-. /])
— тире, точка, пробел или слеш между днем и месяцем; -
d{1,2}
— любое число от одного до двух разрядов (месяц); -
1
— вставляет выражение из первой группы захвата (из первых скобок, т.е. эквивалетно
([-. /])
); -
d{2,4}
— любые числа года от двух до четырех разрядов, которые обозначают год; -
$
— конец строки.
Пишите комментарии, задавайте вопросы, на основе этого статья будет дополняется
.