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