Регулярные выражения - это инструмент, который часто помогает мне сводить многочасовую рутинную работу к нескольким минутам. Это автоматизация, о которой мечтают многие специалисты, но мало кто знаком с ней на практике.
В этой статье я расскажу про основной синтаксис регулярных выражений и на примерах покажу как их можно использовать в работе.
Регулярные выражения — это инструмент для поиска в тексте элементов и подстрок, соответствующих заданному при поиске шаблону. Проще говоря — регулярные выражения помогают найти в тексте все места, где встречается нужный набор символов.
https://regex101.com/ — сайт, на котором можно проверить свое регулярное выражение. В статье я привожу скриншоты с работой регулярок с этого сайта.
Сразу предупрежу, что в статье я описываю не все возможности регулярных выражений. Каждое из приведенных мною выражений можно оптимизировать и сократить.
Но именно в таком формате, по-моему, тема регулярных выражений должна быть максимально понятна для новичков.
В интернете есть большое количество статей по регуляркам. Многих новичков такие статьи пугают своими размерами, обилием новых терминов, символов и сокращений.
На самом деле, большая часть регулярных выражений - это синтаксический сахар. Он делает работу с регулярными выражениями удобнее. Но обращать внимание на такой сахар стоит уже после того, как освоился с ядром. Само “ядро” регулярок состоит из 5 простых правил.
Сразу предупрежу, что изначально регулярные выражения чувствительны к регистру. То есть буква “а” и буква “А” - это разные буквы. Подробнее о таком поведении, и как его изменить, вы можете прочитать в разделе "Модификаторы".
Для простоты понимания договоримся, что конец текста - это переход на новую строку, а начало текста - это начало строки.
-
Если вы точно не знаете, в какой части находится искомый текст, игнорируем это правило;
-
Если искомый текст надо найти только в начале строки, используйте знак крышечки ^;
-
Если искомый текст надо найти только в конце строки, используйте знак доллара $.
ПРИМЕР: Найдем в тексте слово “яблоко”:
Выражение |
Описание |
Пример |
Скриншот |
X |
Поиск везде |
яблоко |
|
^X |
Поиск в начале |
^яблоко |
|
X$ |
Поиск в конце |
яблоко$ |
Если надо найти подстроку, которая может принимать несколько разных значений, достаточно перечислить все искомые значения в круглых скобках через знак вертикальной черты ( | ).
ПРИМЕР: Найдем в тексте слово “яблоко” или “груша”:
Выражение |
Описание |
Пример |
Скриншот |
(X|Y) |
Или, или |
(яблоко|груша) |
Проверки — это поиск подстроки, с условием, что перед (или после) ней точно должна быть (или не должна быть) другая подстрока. Всего есть 4 типа таких проверок:
Позитивная опережающая проверка — найти X при условии, что за ним следует Y.
Негативная опережающая проверка — найти X при условии, что за ним НЕ следует Y.
Позитивная ретроспективная проверка — найти X при условии, что перед ним находится Y.
Негативная ретроспективная проверка — найти X при условии, что перед ним НЕТ Y.
ПРИМЕР: Найдем в тексте слово “яблоко” с учетом проверок
Выражение |
Описание |
Что ищем |
Пример |
Скриншот |
X(?=Y) |
Найти X при условии, |
Сочные яблоки |
яблоко(?= сочное) |
|
X(?!Y) |
Найти X при условии, |
Не сочные яблоки |
яблоко(?! сочное) |
|
(?<=Y)X |
Найти X при условии, |
Зеленые яблоки |
(?<=Зеленое) яблоко |
|
(?<!Y)X |
Найти X при условии, |
Не зеленые яблоки |
(?<!Зеленое) яблоко |
* Обратите внимание, что в примерах регулярных выражений стоят пробелы. Это важно, так как пробел тоже является знаком.
Как видно из примеров выше, при помощи регулярных выражений можно искать слова целиком.
Но настоящая сила регулярных выражений заключается в том, что они могут найти подстроки, которые содержат любые нужные нам наборы букв, цифр или символов. Даже если мы заранее не знаем их точного порядка.
Группировка — указание списка (группы) букв, цифр и символов, которые должны присутствовать в искомой подстроке.
Искомая группа объектов перечисляется внутри квадратных скобок [ ].
Например, регулярное выражение [абв37,] найдет в тексте все места, в которых встречаются буквы “а”, “б”, “в” или цифры “3”, “7” или символ запятой “,”.
Если в искомой строке может быть любая буква алфавита или любая цифра, используется срез.
Срез — указание первой и последней буквы или цифры через тире. При этом будут включены все буквы и цифры, находящиеся между указанными.
Например, регулярное выражение [а-яё] найдет в тексте все места, в которых встречаются буквы от “а” до “я”.
Примеры срезов:
Выражение |
Описание |
Скриншот |
[А-ЯЁ] |
Найдет все кириллические буквы в верхнем регистре. Буква Ё не входит в срез [А-Я], поэтому её необходимо включать дополнительно. |
|
[0-9] |
Найдет все цифры. |
|
[a-z] |
Найдет все латинские буквы в нижнем регистре. |
|
[А-яA-z0-9,.& ] |
Найдет все кириллические и латинские буквы в верхнем и нижнем регистрах, цифры от 0 до 9 и символы запятой, точки, амперсанд и пробел. |
Искомые нами подстроки могут содержать определенное количество букв, цифр или символов. Или вообще их не содержать.
И в этом случае регулярные выражения смогут найти то, что нам нужно:
Выражение |
Описание |
Пример |
Скриншот |
Поиск без оператора |
купить грушу и яблоко |
||
X? |
Одно или ни одного вхождения |
купить грушу( и яблоко)? |
|
X* |
Много или ни одного вхождения |
купить грушу( и яблоко)* |
|
X+ |
Одно или много вхождений |
купить грушу( и яблоко)+ |
|
X{3} |
Вхождение 3 раза |
а{3} |
|
X{3,6} |
Вхождение от 3 и более раз |
а{3,6} |
|
X{,6} |
Вхождение до 6 раз |
а{,6} |
Если необходимо найти подстроки, с учетом, что в них НЕ должны входить какие-то буквы, цифры или символы, достаточно перечислить необходимые символы в группировке, добавив в начале группировки знак крышечки ^.
Выражение |
Описание |
Пример |
Скриншот |
[^X] |
Найти символы, кроме указанных |
[^а] |
Выше я обращал внимание на то что, если в искомой подстроке есть пробел, его необходимо указывать явно.
Кроме пробела есть и другие скрытые символы, которые могут быть найдены.
Символ |
Описание |
\n |
Перенос на новую строку |
\r |
Возвращение каретки в начало строки. Обычно используется совместно с переносом на новую строку |
\t |
Табуляция |
\ |
Изоляция символа. Например, нужно найти подстроку со знаком звездочки. Достаточно искать \*. |
. |
Любой символ |
Модификаторы (или флаги) — это дополнительные настройки, которые изменяют поведение регулярного выражения.
В большинстве инструментов модификаторы вынесены в отдельные настройки регулярок, или настроены максимально дружелюбно, чтобы понять, что именно пользователь хочет найти.
Пример настройки модификаторов в Notepad++.
Модификатор |
Отображение |
Описание |
Пример выключенный |
Пример включенный |
Global. Глобальный поиск |
/g |
|
||
Multiline. Мультистроковость |
/m |
|
||
Case insetsitive Чувствительность к регистру |
/i |
|
В начале статьи я говорил, что регулярки помогают мне сокращать рутинную работу, поэтому дальше покажу рабочие примеры использования регулярных выражений.
Задача: Есть интернет-магазин. Необходимо получить информацию о количестве товаров в каждом каталоге. Всего на сайте 2500+ каталогов товаров. Информация о количестве товаров выводится на странице каталога в текстовом блоке, которые имеет вид: “Название каталога N”, где N -- это количество товаров.
Решение:
-
Получаем список всех каталогов с количеством товаров.
Чайники247
Заварники8
Сковороды27
Грили Test12
-
Видим что в каталоге может быть количество товаров с числом состоящим от 1 до 3 цифр. А название каталога может содержать кириллические и латинские буквы.
-
Определяем что количество товаров мы можем получить при помощи регулярного выражения через позитивную ретроспективную проверку + количество вхождений от 1 до 3.
Регулярное выражение |
Результат |
(?<=[А-Яа-яA-Za-z])[0-9]{1,3} |
Задача: Федеральный сайт по продаже специализированного оборудования. Необходимо визуализировать воронку оформления заявки в Google Data Studio.
Решение:
-
Выгружаем из Google Analytics данные по url из воронки.
-
Видим, что на некоторых этапах воронки в URL добавляется город посетителя. А на некоторых этапах в URL добавляется название товара.
-
Добавляем пользовательский параметр с настройкам:
Этап |
Пример URL |
Регулярное выражение |
Результат |
1. Начало воронки |
/order/ |
\/order\/$ |
|
2. Выбор региона |
/order/moscow/ |
\/order\/[A-Za-z]{2,10}\/$ |
|
3. Выбор характеристик |
/order/moscow/info/ |
\/order\/[A-Za-z]{2,10}\/info\/$ |
|
4. Выбор модели |
/order/moscow/info/k-705-wi/ |
\/order\/[A-Za-z]{2,10}\/info\/[A-Za-z0-9-]{1,20}\/$ |
|
5. Завершение |
/order/moscow/info/k-705-wi/successful/ |
\/order\/[A-Za-z]{2,10}\/info\/[A-Za-z0-9-]{1,20}\/successful\/$ |
Польза регулярных выражений в их гибкости. Ведь все те примеры, что я приводил, можно использовать совместно друг с другом.
Как я говорил в начале статьи, у регулярных выражений есть большое количество синтаксического сахара, который помогает делать сами регулярные выражения короче. Но такие вещи могут путать и пугать новичков. Поэтому привожу примеры сокращений в конце основной статьи.
Описание |
Регулярное выражение |
Сокращение |
Найти пробелы, переносы строк или табуляцию |
( |\t|\r\n) |
\s |
Любые символы кроме пробела, переноса или табуляции |
[^( |\t|\r\n)] |
\S |
Любые цифры |
[0-9] |
\d |
Любые символы, кроме цифр |
[^0-9] |
\D |
Любые буквы, цифры и подчеркивание |
[A-zА-я0-9_] |
\w |
Любые символы кроме букв, цифр и подчеркиваний |
\W |