Регулярные выражения (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}\1\d{2,4}$
Разбор
^
— начало строки;\d{1,2}
— любое число от одного до двух разрядов (день);([-. /])
— тире, точка, пробел или слеш между днем и месяцем;\d{1,2}
— любое число от одного до двух разрядов (месяц);\1
— вставляет выражение из первой группы захвата (из первых скобок, т.е. эквивалетно([-. /])
);\d{2,4}
— любые числа года от двух до четырех разрядов, которые обозначают год;$
— конец строки.
Пишите комментарии, задавайте вопросы, на основе этого статья будет дополняется.
1 комментарий
Имя
Вот такой URL не находит: https://ya.ru?q=123