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

Во время одного из своих выступлений Кевин Скоглунд поделился интересной мыслью о регулярных выражениях: первоначально команда «grep» означала «глобальная печать регулярного выражения», а аббревиатура «g/re/p» представляла порядок глобального режима в передний. Однако со временем глобальный режим был перемещен в конец, что привело к современному синтаксису «/re/g».

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

  1. Извлечение определенных текстовых значений из большей строки. Например, вы можете использовать регулярное выражение для получения всех адресов электронной почты из документа.
  2. Проверка соответствия строки текста определенному шаблону. Например, вы можете использовать регулярное выражение, чтобы проверить, имеет ли номер телефона определенный формат.
  3. Преобразование строки текста в другой формат. Regex может помочь вам в этом, выполняя поиск определенных шаблонов и заменяя их нужным форматом.

При работе с регулярными выражениями полезно иметь доступ к инструментам, которые могут помочь вам в построении и тестировании ваших выражений. Некоторые популярные варианты включают в себя:

  1. regexr.com: этот веб-сайт предоставляет удобный интерфейс для создания и тестирования шаблонов регулярных выражений. Он включает в себя обратную связь в режиме реального времени и полезные ресурсы, которые помогут вам в создании эффективных выражений.
  2. regex101.com: этот инструмент предлагает более продвинутый интерфейс для создания и тестирования шаблонов регулярных выражений. Он включает в себя такие функции, как подсветка синтаксиса, объяснение структуры выражения и возможность создания пользовательской тестовой строки.

Оба этих ресурса могут оказать неоценимую помощь в создании и тонкой настройке выражений регулярных выражений.

НОВИНКА: https://chat.openai.com/ — теперь создание регулярных выражений стало намного проще, но по-прежнему важно понимать регулярное выражение, чтобы иметь возможность просматривать и оспаривать регулярное выражение, созданное с помощью чата gpt. .

Основы:

  1. Флаги/режимы выражений

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

A. Глобальный (g): в этом режиме выполняется поиск всех вхождений шаблона во входной строке вместо остановки после первого совпадения.

B. Нечувствительный к регистру (i): в этом режиме совпадение шаблона нечувствительно к регистру, что позволяет ему сопоставлять текст независимо от того, в каком регистре он находится: в верхнем или нижнем.

C. Многострочный (m): этот режим позволяет символам ^ и $ совпадать с началом и концом каждой строки в многострочной входной строке, а не только с началом и концом всей строки.

D. Unicode (u): этот режим включает поддержку символов Unicode в шаблоне и входной строке.

E. Sticky (y): в этом режиме поиск совпадений начинается с позиции lastIndex предыдущего совпадения. Это полезно для поиска нескольких совпадений в строке с общим префиксом.

Понимая и используя эти флаги/режимы, вы можете сделать свои регулярные выражения более универсальными и мощными.

2. Сопоставление литеральных символов:

Сопоставление литеральных символов является основной концепцией регулярных выражений. Например, выражение /abc/ соответствует текстовой строке «abc». Важно отметить, что регулярное выражение по умолчанию чувствительно к регистру, поэтому «abc» и «abC» не будут считаться совпадениями, если вы не используете флаг без учета регистра, обозначаемый как /abc/i.

Также стоит отметить, что пробелы считаются символами в регулярном выражении, поэтому строка типа «a b c» не будет соответствовать буквальному символьному выражению /abc/. Однако вы можете использовать дополнительный синтаксис регулярных выражений для учета пробелов, таких как класс пробельных символов (\s) или сами определенные пробельные символы.

Рабочий пример

Чтобы продемонстрировать практическое использование регулярного выражения, давайте рассмотрим пример извлечения параметров запроса из URL-адреса с помощью регулярного выражения.

При тестировании данных отчетов Adobe Analytics данные часто отправляются в виде параметров в URL-адресе. Используя регулярное выражение, мы можем извлечь эти параметры и использовать их для утверждения данных. Например, мы можем проверить, присутствуют ли ожидаемые параметры в URL-адресе, и проверить их значения.

Вот пример URL с параметрами запроса:

Задача: Извлечение всех параметров из заданного URL и создание функции для каждого из них.

Во-первых, нам нужно очистить URL-адрес, так как он содержит закодированные символы. URL-адреса можно отправлять через Интернет только с использованием набора символов ASCII, что означает, что небезопасные символы ASCII заменяются знаком «%», за которым следуют две шестнадцатеричные цифры. Например, пробел становится «%20». Мы можем использовать методы JavaScript, такие как replace() или replaceAll(), для замены определенных значений в URL-адресе.

Одним из вариантов очистки URL-адреса является использование метода replaceAll(). Вот пример того, как использовать этот метод для замены всех преобразованных вхождений ASCII их значениями:

Вариант A: использование .replaceAll() для очистки значений

Вариант B: Использование decodeURIComponent() для декодирования значений URL. Это позволяет избежать выполнения вышеуказанного.

Во-вторых, после очистки URL-адреса следующим шагом будет выявление шаблонов в параметре/строке, которые мы хотим сопоставить. Например, параметры запроса имеют тенденцию следовать шаблону «?parameter=value» =› |**=**|.

В этом случае все параметры имеют знак равенства между собой, например «ATV=1», «nra=1» и т. д. Таким образом, мы можем использовать знак равенства в качестве разделителя для извлечения имени параметра и его соответствующего значения.

Для этого мы можем использовать регулярное выражение для сопоставления значений, которые необходимо извлечь. Поскольку параметры следуют согласованному шаблону, мы можем использовать простой шаблон регулярного выражения для извлечения имени и значения параметра.

Например, мы можем начать с сопоставления любого слова или числового символа, который появляется перед знаком равенства, за которым следует любое слово или числовой символ, который появляется после знака равенства:

Левый шаблон:и слева от знака равенства находятся слова и числа, поэтому

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

Чтобы сопоставить значение параметра, мы можем начать с использования знака равенства в качестве разделителя, как и в предыдущем шаге:

Шаг 1. Использование = возвращает первый экземпляр равенства в строке: /=/

Шаг 2. добавление флага g(global) возвращает все экземпляры equal: /=/g

Шаг 3. Для всех совпадающих экземпляров слева от равенства есть символы или числа, поэтому использование \w охватывает как символы, так и числа. Только для 1 символа или числа используйте: /w=/g

Шаг 4. Поскольку вам нужны полные слова, а не отдельные символы, можно использовать метасимвол повторения [MC007]. Это +, *, ? : например. /w+=/g

  • \w*=\g: возвращает совпадение, если есть только знак =, а также любая буква или цифра со знаком = после него
  • \w+=\g: возвращает совпадение только в том случае, если после = стоит любая буква или цифра
  • \w?=\g: то же, что и *, но соответствует только 1 символу или цифре

Этот шаблон регулярного выражения соответствует любому слову или числовому символу, который появляется перед знаком равенства, за которым следует знак равенства, и любым символом, не являющимся пробелом, который появляется после знака равенства, захваченного в первой группе.

Правильный шаблон: справа от знака равенства немного сложнее, там другие символы, пробелы, слова и цифры.

поскольку значение параметра может включать различные символы, нам нужно использовать комбинацию наборов символов [MC004] и диапазонов [MC005], чтобы соответствовать всем возможностям. Мы можем использовать следующий шаблон регулярного выражения для соответствия всем буквам и цифрам: /=[A-Za-z0–9]

Добавление повторяющегося метасимвола [MC007] «+» к набору символов, например «[A-Za-z0–9]+», позволяет нам сопоставлять все экземпляры одной или нескольких букв или цифр в значении параметра.

шаблон не распространяется на специальные символы.

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

Например, если значение параметра включает вертикальные черты («|») или точки («.»), мы можем добавить эти символы в набор символов в шаблоне. Вот обновленный шаблон, который включает вертикальные полосы и точки.

Настроив набор символов в шаблоне, мы можем сопоставить желаемый набор символов в значении параметра и убедиться, что наше выражение регулярного выражения точно передает нужную нам информацию. В представленном примере обновленный шаблон ниже будет соответствовать значению v25=Chrome|320000|QS111.111.11 содержит | и .

Далее. Примените шаблон с помощью match(), чтобы извлечь значения в массив.

Затем: удаление ненужных данных. В данном случае этот шаг необязателен, он предназначен только для демонстрационных целей. Вы можете использовать регулярное выражение, чтобы удалить URL-адрес из данных. Поскольку никакие утверждения не выполняются в отношении хост-части URL-адреса.

Вы можете начать с определения шаблона/строки, которую можно использовать для извлечения URL-адреса. Начните с применения символов основного слова /w, затем используйте метасимвол повторения [MC007]+. Поскольку в URL-адресе несколько символов, вы можете использовать наборы символов [MC004] и диапазоны [MC005] и заполнить его символами из URL-адреса.

Краткое содержание:

При использовании регулярного выражения

  • определить необходимый шаблон: **=**
  • используйте буквенные символы [LC001] + метасимволы [MC00?] + режимы флагов для создания вашего регулярного выражения
  • тестировать, тестировать, тестировать, что шаблон охватывает все сценарии
  • лучший способ привыкнуть к регулярному выражению — это извлечь операторы на https://regexr.com/, выбрать определенные шаблоны и попытаться создать для них регулярное выражение.
  • NB: пробел также является символом, и при использовании метасимвола вы не хотите применять его в качестве метасимвола. Используйте escape-символ, например . является подстановочным знаком, а не точкой -› \. полная остановка.
  • Важно отметить, что метасимвол подстановки может быть источником путаницы. Метасимвол точки соответствует только одному символу (букве, цифре, пробелу или чему угодно). Например, используя шаблон «с». будет соответствовать любым двум символам, начинающимся с «c», например «cA», «c0», «c!», «c» и т. д.

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

Пример фрагмента кода, который я использовал в cypress для проверки значений в данных URL.