====== Регулярные выражения ====== Регулярные выражения (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/]]