Регулярные выражения: что это, как составить, зачем использовать

Я не знаю человека из сферы интернет-маркетинга, который в своей работе ни разу не встречался с регулярными выражениями. (Вы знаете? Тегните его, пожалуйста, в комментариях). Итак, регулярные выражения: онлайн-маркетинг и базовые знания о регулярках ходят рядом — без последних очень много операций придется выполнять вручную, вместо того, чтобы составить регулярное выражение простого вида ^[a-z].*-\/[0-9]\.html$|^[A-Z][0-9].*\.php$ и выполнить задачу в несколько минут.

О страхе перед регулярными выражениями. Мем

Вас напугал вид выражения? Как составлять регулярные выражения — непонятно? Это нормальная первая реакция, если вы не в теме. Как и во всем, тут надо разобраться, понять логику и результат не заставит долго ждать — вы сможете оперативно работать с текстами, url-адресами и другими данными. А поскольку автоматизация — наше все, я пишу эту статьи и надеюсь, что она поможет самостоятельно составлять простые регулярные выражения, которые вы будете использовать в задачах по оптимизации сайта или запуску контекстной рекламы.

Что такое регулярные выражения?

Это формальный язык поиска и манипуляций с подстроками в тексте. В нем используется строка-образец из символов и метасимволов, задающая правило поиска. Как писать регулярные выражения? Тут нам понадобится синтаксис.

Основы синтаксиса

Первая группа символов — это искомые буквы или цифры, которые обозначают сами себя.

Вторая группа — это спецсимволы, которые указывают некоторое действие или влияют на другие части регулярного выражения, повторяя и/или изменяя их значение.

Специальный символ
Значение
.
Задает один произвольный символ
[]
Заменяет символ из квадратных скобок
Задает один символ, которого не должно быть в скобках
[^]
Задает один символ из не содержащихся в квадратных скобках
^
Обозначает начало последовательности
$
Обозначает окончание строки
*
Обозначает произвольное число повторений одного символа
?
Обозначает строго одно повторение символа
+
Обозначает один символ, который повторяется несколько раз
|
Логическое ИЛИ. Либо выражение до, либо выражение после символа
\
Экранирование. Для использования метасимволов в качестве обычных
( )
Группирует символы внутри
{ }
Указывается число повторений предыдущего символа
Примечание. Некоторые элементы — это специальные метасимволы, которые сами себе не соответствуют. Если нужно найти символ, забрав его суперспособности, можно его экранировать. Таким образом вы покажете, что данный символ означает самого себя. Детальнее об этом далее.

Регулярное выражение может состоять только из простых символов, например «Привет», или только из спецсимволов – ^\D.*. Но более понятным и эффективным вариантом является микс обеих групп символов – ^Привет, \.*$.

Давайте разберемся с возможностями спецсимволов. Для удобства разобьем их на категории:

  • символьные классы — \d \w \s и .;
  • символ экранирования — \;
  • якоря — ^ и $;
  • квантификаторы — * + ? и {n};
  • оператор ИЛИ — |;
  • скобки — () [] и {};
  1. Символьные классы — \d \w \s и Для поиска информации достаточно воспользоваться строкой ввода, ввести необходимый текст и нажать кнопку «Найти». Но иногда нужно найти номера телефонов, не один адрес электронной почты и тд. В этом случае простым вводом в строку поиска не обойтись.Тут в помощь приходят символьные классы, позволяющие «преобразовать» ряд простых символов в короткую команду. Это очень удобно, если стоит задача найти строки, содержащие любую цифру или только буквы, или не пустые, которые иногда тоже нужны.Вот основные символьные классы:
    • \d — соответствует одному символу, который является цифрой, эквивалент класса [0-9];
    • \w — соответствует слову (может состоять из букв, цифр и подчёркивания), эквивалент [a-zA-Z0-9_];
    • \s — соответствует символу пробела (включая табуляцию и прерывание строки), эквивалент [ \t\n\r\f\v];
    • . — соответствует любому символу;
    • У операторов \d, \w и \s также есть отрицания ― \D, \W и \S соответственно.

    Например, оператор \D будет искать соответствия противоположные \d, то есть символы, не являющиеся цифрами.

  2. Символ экранирования — \Давайте обратим внимание на символ обратного слеша – \. Мы уже знаем, что он используется для обозначения классов символов. Кроме этого, обратная косая черта обладает еще одной важной способностью — она отключает действие других спецсимволов, если нам нужно передать их значение буквально.Допустим, мы хотим найти точку. Не «любой символ», а именно точку. Чтобы использовать специальный символ как обычный, необходимо добавить перед ним обратную косую черту. Это называется «экранирование символа».
  3. ЯкоряЧасто возникает необходимость найти строки, начинающиеся или заканчивающиеся конкретным символом, словом или цифрой. Например, чтобы найти URL-адреса, которые начинаются на start, достаточно ввести ^start в поисковой строке, а заканчивающиеся на end — просто добавить символ доллара в конце — end$. Очень просто.^ (символ каретки) — представляет начало строки;$ (символ доллара) — представляет конец строки.Эти две позиции в строке называются якорями, поскольку они позволяют нам привязать шаблон регулярного выражения к конкретной точке в строке.

    \A и \Z, обозначающие начало и конец текста, соответственно.

  4. Квантификаторы — * + ? и {n}Когда появляется необходимость указать количество повторений какого-то символа, например, в случае проверки номера телефона, номера банковской карточки и во многих других случаях, где присутствует повторение символов, в игру вступают квантификаторы.Квантификаторы — это указание количества повторений символов.* (звездочка) — означает 0 или больше количеств повторений.+ (плюс) — означает одно или больше количеств повторений. Чтобы строка соответствовала регулярному выражению, должно быть хотя бы одно повторение указанного символа (в этом отличие от предыдущего квантификатора).

    ? (знак вопроса) — означает 0 или одно повторение. То есть либо одно повторение, либо ни одного.

    Когда возникает необходимость указать конкретное количество или интервал повторений, его можно указать внутри фигурных скобок, сразу же после символа, который нужно повторять. Есть 3 варианта:

    {n} — конкретное количество — n — повторений.
    {min,} – минимальное количество повторений и до бесконечности.
    {min,max} — интервал количеств повторений.

    Эти символы значительно сокращают регулярные выражения. Например, при проверке номера банковской карточки. Мы знаем, что такой номер состоит ровно из 16 цифр. Поэтому в регулярном выражении нам нужно указать это конкретное количество цифр. А чтобы не писать 16 раз подряд символ класса ‘ \d ‘, вот так:

    var reg = /^\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d$/;

    Мы можем воспользоваться квантификатором повторений и написать регулярное выражение таким образом:

    var reg = /^\d{16}$/;

  5. Оператор ИЛИ — |Чтобы проверить, удовлетворяет ли строка хотя бы один из шаблонов, можно воспользоваться оператором ИЛИ, который записывается с помощью символа |.Так, под шаблон «Привет|Здравствуйте» попадают строки «Привет» и «Здравствуйте» соответственно. Особенно удобно использовать перечисления внутри скобочных групп. Так, например (?:a|b|c|d) полностью эквивалентно [abcd] (в данном случае второй вариант предпочтительнее из-за производительности и читаемости).
  6. Скобки в регулярных выражениях — () [] и {}Регулярные выражения предлагают нам три вида скобок:
    • круглые скобки в регулярных выражениях — ();
    • допускают регулярные выражения квадратные скобки — [];
    • фигурные скобки — {}.

    Обычные регулярные вырадения и круглые скобки в них. Главное, что нужно о них знать, — они очень эффективно работают с оператором ИЛИ выполняя функцию группировки.

    Возьмем простой пример, необходимо найти строку с похвалой «Молодец». Вроде бы все просто: пропишем это слово целиком в качестве шаблона и делов. Но в действительности все не так — слово «Молодец» может встречаться иначе, например, «Молодчага» (с окончанием -чага вместо -ец). Чем не похвала? Соответственно, в регулярном выражении необходимо указать альтернативу — ец|чага.

    Попробуем:

    Молодец|чага

    Такой запрос найдет нам «Молодец» или «чага»

    Немного не то. Все дело в том, что символ альтернативы | берет в качестве вариантов все, что находится слева и справа от него. Как же нам указать, что необходимо взять только по одной букве справа и слева? Вот здесь на помощь приходят круглые скобки, которые выполнят необходимую группировку.

    Молод(ец|чага)

    Вот теперь все хорошо. Кроме того данный вид скобок позволяет запоминать найденное. Так как таких групп может быть несколько, они нумеруются; в данном случае часть будет доступна в переменной под номером один — $1.

    $1 = (ец|чага)

    С круглыми скобками разобрались. Переходим к квадратным. Когда мы рассматривали символьные классы, рядом с каждым шаблоном типа \d одному символу-цифре соответствует эквивалент формата — [0-9], логично обозначающий то же самое. Но, разумеется, вариант со слешем удобнее и запоминается легче, чем например [ \t\n\r\f\v] – символ пробела — легче записать так — \s.

    Иногда необходимо создать свой собственный пользовательский класс. Это возможно благодаря квадратным скобкам и перечню всевозможных символов, которые могут встретиться. Допустим, различные окончания слова Вода — Вод[аеыу] или соответствие разным падежам.

    Квадратные скобки также могут встречаться со знаком ^ сразу после открывающей скобки. Такой дуэт выполняет «отрицательную» функцию. То есть при запросе [^Молодец] найдуться далеко не хвалебные строки. Так работает и с символьными классами, например [^0-9], будет искать соответствия противоположные, то есть все, что не соответствует цифрам в скобках.

    Ну и напоследок вспомним регулярные вырадения и фигурные скобки — {}, а именно — их функционал. Их используют при необходимости указать количество повторений символа, стоящего перед скобками. Мы детально это рассматривали в разделе квантификаторы.

    Метасимвол ИЛИ в квадратных скобках не работает.

Флаги

Мы изучили достаточное количество специальных символов и научились строить регулярные выражения, но забыли о фундаментальной концепции ― флагах.

Флаги — это дополнительные надстройки для шаблона регулярного выражения, которые расширяют их функции. Флаги указываются после регулярного выражения (порядок флагов значения не имеет).

Примечание. Если хотите воспользоваться флагом, выделите регулярное выражение двумя слешами /.

Рассмотрим основные флаги в регулярных выражениях:

  1. g (global) ― не возвращает результат после первого совпадения, а продолжает поиск с конца предыдущего совпадения.
  2. m (multi line) ― с таким флагом, операторы ^ и $ вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
  3. i (insensitive) ― делает выражение регистронезависимым (например, /aBc/i соответствует AbC).

Если с последним флагом все более-менее понятно, то первые два давайте рассмотрим на примере.

Допустим, у нас есть строка типа:

1‑е место: № 7 ― Тинки-Винки.
2‑е место: № 13 ― Лала.
3‑е место: № 4 ― По.

И нам нужно найти:

  1. Все цифрыШаблон \d, по умолчанию, выдаст нам первое совпадение, то есть «1». Чтобы найти все присутствующие в тексте цифры необходимо подключить флаг глобального поиска — /\d/g, который выдаст нам все совпадения.
  2. Только цифры в начале строкиДобавить якорь начала строки будет недостаточно. Шаблон ^\d выдаст только «1», глобальный флаг тут не поможет. И это не ошибка. Почему так? Потому что, начало строки в нашем примере действительно только перед единицей, а конец, соответственно, — в самом конце строки:^1–е место: № 7 ― Тинки-Винки
    2‑е место: № 13 ― Лала
    3‑е место: № 4 ― По$Чтобы считать каждый перенос строки на новую линию «началом», нужно воспользоваться флагом многострочного режима m: шаблону /^\d/gm будут соответствовать «1», «2» и «3», ведь строку такой шаблон будет видеть так:^1е место: № 7 ― Тинки-Винки$
    ^2е место: № 13 ― Лала$
    ^3е место: № 4 ― По$

    Аналогично, можно искать символы с конца строки и линий.

    В сервисах, которыми мы пользуемся, по умолчанию выполняется глобальный поиск без учета регистра, поэтому с флагами будем встречаться не часто. Чтобы детально ознакомиться с их функциями, предлагаем познакомиться с примером на Regex101.

Применение на практике

Пример №1

На сайте есть 2 thank you page:

  • https://inweb.ua/thank-you-page/
  • https://inweb.ua/order-success/

Нам нужно учитывать их посещение, как выполнение одной цели в Google Analytics. Для этого выбираем в GA цель по посещению страницы и указываем регулярное выражение:
thank-you-page|order-success

Пример №2

Мы внедрили новый дизайн карточки товара и хотим узнать, как это повлияло на количество трафика. Таких страниц несколько и их url-адреса отличаются только цифрой в конце:
https://inweb.ua/category-34/best-iphone-ever4

Посмотреть, как изменился трафик на страницы товаров, мы можем по странице входа в Google Analytics, используя простое регулярное выражение:

[0-9]$

А если мы хотим выделить все url-адреса товаров в таблице – лучше использовать:

.*[0-9]$

Пример №3

Есть список url-адресов с относительными ссылками, например:
/category/tovar/
/contacts/

Задача: сделать абсолютно все url-адреса абсолютными с доменом https://inweb.ua/

При помощи регулярного выражения ^\/ мы можем выделить первый слеш в строке и осуществить глобальную замену на нужный нам домен.

Пример №4

Допустим, есть документ с 50 000 строк, среди них есть пустые, которые нужно удалить. Для решения задачи можно выделить пустые строки с помощью ^\s*$ и осуществить замену.

Пример №5

Есть 50 000 номером телефонов, в 1% из них добавлена дополнительная информация, которую нужно убрать, например:

  • +380001234567 факс
  • +380001234567- Валера
  • +380001234567(Бухгалтерия)
  • +380001234567 Юра Колокол

Формат, который нам нужен, выглядит так: +380001234567.

При помощи регулярного выражения(-.*|\(.*|.[A-z].*|[А-я].*) выделяем все варианты дополнительной информации, которую нужно удалить и заменить.

Пример №6

В документе с текстом есть двойные и тройные пробелы, например:

Мы собираем информацию, когда вы входите на сайт, заходите на свой аккаунт и/или выходите из своего аккаунта. Информация включает ваше имя, адрес электронной почты, номер телефона. Кроме того, мы автоматически регистрируем ваш компьютер и браузер, включающие IP, ПО и Аппаратные данные, а также адрес запрашиваемой страницы.

Для того чтобы их убрать используем регулярное выражение \s{2,} и заменяем на один пробел.

Справочные материалы по теме

  1. Удобный сервис для проверки работоспособности регулярных выражений.
  2. Шпаргалка по регулярным выражениям.
  3. Как новичку разобраться в регулярных выражениях.
  4. Регулярные выражения в notepad++ поиск и замена в тексте.
  5. Сложный тест на знание регулярных выражений.
  6. Примеры регулярных выражений.