Регулярные выражения

Регулярные выражения (Regular expressions, или просто regexp) — механизм, который позволяет осуществлять сложный поиск подстроки по заданному шаблону. Вот как раз о шаблонах мы и поговорим сегодня.

// Начало текста
^

// Конец текста
$

// Любой единичный символ
.

// Количество совпадений 0 или 1. То же самое, что и {0,1}.
?

// Любое количество совпадений или их отсутствие. То же самое, что и ({0,}).
*

// Как минимум одно повторение. То же самое, что и ({1,}).
+

// Совпадения от m до n включительно.
{m,n}

// Нижняя граница совпадений.
{m,}

// Верхняя граница совпадений.
{,n}

Сложно? Ниже есть примеры, по ним будет все понятно. https://regex101.com/

// Цифра (0-9)
\d

// Не цифра (любой символ кроме символов 0-9)
\D

// Пустой символ (пробел и табуляция)
\s

// Непустой символ (все, кроме символов, определяемых метасимволом \s)
\S

// "Словесный" символ (все буквы, цифры и подчеркивание ('_'))
\w

// Все, кроме символов, определяемых метасимволом \w
\W

// Символ на границе слова (в начале или в конце)
\b

// Символ внутри слова
\B
// Простая группа с захватом.
( )

/* Группа без захвата.
Выражение: про(?:фессиональное|движение);
Результат: Найдены оба слова.
*/
(?: )

/* Группа с положительной опережающей проверкой.
Выражение: говор(?=ит);
Результат: Найдено только слово "говорит" (еще нашло бы "говор").
*/
(?= )

/* Группа с положительной опережающей проверкой.
Выражение: говор(?!ит);
Результат: Найдено "говорю", "говори", но не "говорит".
*/
(?! )

/* Группа с положительной ретроспективной проверкой.
Выражение: (?<=об)говорить;
Результат: Найдено «говорить» и «обговорить», но не «уговорить».
*/
(?<= )

/* Группа с отрицательной ретроспективной проверкой.
Выражение: (?<!об)говорить;
Результат: Найдено «говорить» и «уговорить», но не «обговорить».
*/
(?<! )

Грубо говоря все сводится к следущей форме:

^([разрешенные и запрещеные символы]{количество повторений})$

Регулярное выражение для поиска 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 в строке

^(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/