/Hello World/, в этой статье давайте узнаем о регулярных выражениях (также известных как Regex или Regexp), дадим несколько советов по этому поводу и посмотрим, как они могут помочь вам, когда вам нужен простой способ извлечения , проверить (сопоставить) и заменить данные (с упором на строки).

Введение

Да, я знаю, что регулярные выражения — страшные монстры для большинства новичков в ИТ, по крайней мере для меня. Хороший момент: когда я говорю об ИТ, речь идет об ИТ в целом, а не только о программировании. Разве вы не знали, что это можно использовать вне кода? Ты можешь! Хорошим примером является Microsoft Excel, где такие функции, как RegExpMatch, RegExpExtract и RegExpReplace, можно использовать во многих случаях. Итак, эту статью не обязательно читать только программистам. Имейте в виду, что хотя этот текст не привязан к конкретному языку или программному обеспечению, я собираюсь продемонстрировать идею, которую я собираюсь использовать с помощью JavaScript и среды выполнения DevTools, чтобы представить и протестировать этот DSL для вас.

Первый вопрос: что такое регулярное выражение? Итак, регулярное выражение — это DSL (язык, специфичный для предметной области), что означает, что это способ выразить что-то посредством его синтаксиса и семантики. Теория замечательная, но давайте посмотрим на нее подробнее.

Глубокое погружение

Представьте, что вам нужно сопоставить следующий список строк в уникальном предложении If-Else: «Я хочу новую книгу», «Я хочу новую КНИГУ» и «Я ХОЧУ НОВУЮ КНИГУ». Еще один момент: вам не разрешено использовать функции UpperCase и LowerCase. Конечно, вы можете найти другие способы сделать это, например, использовать ASCII для сравнения или вычисления равенства, но почему бы не добавить новый элемент под названием regex в наш набор инструментов для ИТ-специалистов? Чтобы решить эту проблему, я могу просто использовать регулярное выражение: /i хочу новую книгу/i. Разве это не обычная строка? Но что это значит? Нет, это не обычная строка, это регулярное выражение. Во-первых, это регулярное выражение можно интерпретировать по тексту, используемому между косыми чертами: «я хочу новую книгу», которая является «ядром» регулярного выражения, то есть тому, что нам нужно сопоставить. Во-вторых, вокруг «ядра» есть две косые черты, и здесь у нас есть важный момент: в зависимости от регистра и языка оно будет использоваться или нет, например:

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

  • Пример JavaScript: /regex_pattern/
  • Пример Python (с модулем re): re.search(r'regex_pattern', input_string)
  • Пример PHP: preg_match('/regex_pattern/', $input_string)
  • Пример Perl:$input_string =~ /regex_pattern/
  • Пример Ruby: /regex_pattern/
  • Пример Java (с классом Pattern):Pattern.compile("regex_pattern")

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

  • Пример C#: Regex.Match(input_string, "regex_pattern")
  • Пример C++ (с библиотекой <regex>): std::regex regex_pattern("regex_pattern");
  • Пример C (с использованием библиотеки регулярных выражений POSIX): regcomp(&regex_pattern, "regex_pattern", 0)
  • Пример Swift (с классом NSRegularExpression): NSRegularExpression(pattern: "regex_pattern", options: [])

Итак, на данный момент вы можете уловить идею, но а «i» в конце регулярного выражения? Это флаг, в данном случае он представляет собой «нечувствительный регистр», что означает, что регулярное выражение должно игнорировать разницу между верхним и нижним регистром. Хотя вы можете использовать этот шаблон для представления флагов в JavaScript, вы должны знать, что флаги можно использовать таким образом в других языках или технологиях!

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

Текст

  • [a-z]Прописные буквы
  • [A–Z] Строчные буквы
  • [0–9] Числа

Количество

  • + Означает один или несколько
  • {n Указывает количество (n — число)

Знаки

  • ^ Начать
  • $Конец

Специальный

  • . Любая клавиша
  • \SЛюбой ключ, кроме пробела
  • \sПустое пространство

Позвольте мне привести вам простой пример:

Напишите шаблон регулярного выражения, соответствующий «CCC-4444».
Ответ:
/^[A-Z]{3}-[0–9]{4}$/

В этом примере мы можем видеть все элементы, о которых я рассказал выше. Я не собираюсь объяснять каждый символ, но вот ЧРЕЗВЫЧАЙНО ВАЖНЫЙ СОВЕТ: попробуйте последовательно сопоставить шаблон регулярного выражения, это способ легко понять потенциал регулярное выражение.

Но в каких случаях этот подход может оказаться полезнее конкретного? Давайте еще раз подумаем о другом варианте использования:

Вы являетесь разработчиком WordPress, сайт компании, в которой вы работаете, подвергается хакерским атакам, вам необходимо фильтровать все комментарии, которые могут представлять опасность. Они вставляют ‹script›‹/script› в середину большого текста. Какое регулярное выражение вы бы использовали для сопоставления с этим случаем?

Ответ: /.+‹script›‹\/script›.+/

Секреты и уловки

Как уже упоминалось в начале этой статьи, мы можем использовать шаблоны регулярных выражений не только для программирования, еще одна применимая вещь, которую мы могли бы использовать, — это VS Code IDE. Если вы хотите выполнить поиск (ctrl+f), вам нужно будет щелкнуть звездочку в поле поиска. Эта опция была выделена в разделе после, поэтому следуйте изображениям выше:

До:

После:

Как вы можете видеть в разделе «до», выделенный текст соответствует только общей строке «.» (точка), но во втором случае оно соответствует шаблону регулярного выражения «.».

И это еще не все, что вы можете сделать. Другой вариант использования — использовать это регулярное выражение в NGINX, где мы можем указать место для добавления заголовка, посмотрите пример ниже:

    location ~ ^/[a-z][a-z][a-z]/index.html$ {
        add_header test test;
    }

Я добавил регулярное выражение в местоположения с тремя символами и сказал nginx добавить определенный заголовок в заголовки ответов.

Заключительные слова

Наконец, я хочу дать здесь хороший совет, чтобы помнить обо всех этих концепциях: вам следует попытаться начать использовать регулярные выражения, а не простое сравнение строк, и не только это, но вам нужно вставить этот новый способ работы со строками во всех возможных случаях. В любой момент (и, как вы видите, его можно применять практически во всем) и помните о знаниях своей команды, читаемое должно быть в первую очередь хорошим и конкретным шаблоном. Я также хочу поблагодарить вас за чтение и хотел бы сказать, что я опубликую еще одну статью о группах в регулярных выражениях (важная функция, она может изменить ваш подход к кодированию), и когда она будет опубликована, я настоятельно рекомендую вам прочитать ее, если вам понравилось содержание этого текста. Большое спасибо!