====== Регулярные выражения ======
Регулярные выражения (Regular expressions, или просто regexp) — механизм, который позволяет осуществлять сложный поиск подстроки по заданному шаблону. Вот как раз о шаблонах мы и поговорим сегодня.
===== Специальные символы =====
// Начало текста
^
// Конец текста
$
// Любой единичный символ
.
// Количество совпадений 0 или 1. То же самое, что и {0,1}.
?
// Любое количество совпадений или их отсутствие. То же самое, что и ({0,}).
*
// Как минимум одно повторение. То же самое, что и ({1,}).
+
// Совпадения от m до n включительно.
{m,n}
// Нижняя граница совпадений.
{m,}
// Верхняя граница совпадений.
{,n}
Сложно? Ниже есть примеры, по ним будет все понятно. [[https://regex101.com/|https://regex101.com/]]
===== Метасимволы =====
// Цифра (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}'' — любые числа года от двух до четырех разрядов, которые обозначают год;
* ''$'' — конец строки.
Проверить регулярное выражение можно в реальном времени на этом сайте [[https://regex101.com|https://regex101.com/]]