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

Я думал «даже если это полезно, его легко заменить обычным кодом, так что учить его не стоит», и мое мышление не изменилось… пока мне не пришлось начать с этим работать.

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

Почему это так полезно?

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

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

  • \d означает цифру, число от 0 до 9
  • \s означает пустое место, может быть пробел или табуляция
  • . означает любой знак
  • \w означает любую букву
  • любая буква или цифра означает именно эту букву или цифру, например, е означает е, а означает а, 2 означает 2 и т. д.
  • \ означает именно то, что после него, например, точка — это специальный символ, поэтому, если вы хотите найти точку, вам нужно написать «точно точка» (\.), чтобы написать «точно \», будет (\\) и т. д.

Вы можете описать количество элементов

  • ? означает 0 или 1 (или просто необязательный элемент)
  • {0, 10} означает от до, в данном случае от 0 до 10 элементов, {2, 5} означает от 2 до 5 элементов.
  • * означает от 0 до бесконечности, поэтому это необязательно, но если элементы после сопоставления, то эти элементы будут сопоставлены
  • + означает *, но не обязательно (от 1 до бесконечности)

А также есть группы, которые могут быть названы или не названы.

  • если вы хотите безымянную группу, вы должны поставить регулярное выражение в скобки (регулярное выражение)
  • если вам нужна именованная группа, вам нужно использовать конструкцию (?‹groupname›regex)
    (группы полезны, если вы хотите использовать логику для извлечения данных из совпадающего текста, многие редакторы имеют возможность изменять текст, и это на основе именованной группы)

Вы можете определить начало и конец текста

  • ^ начало текста
  • $ конец текста

Выглядит не так страшно, как если бы вы смотрели примеры из интернета, верно?
(регулярное выражение для действительного адреса очень страшно… https://emailregex.com/)

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

Для этого нужно написать очень сложное регулярное выражение «\s», или более безопасное «\s\,».

Пример из жизни

В этом примере я рекомендую использовать механизм регулярных выражений, чтобы проверить, что и когда соответствует, мой любимый https://regex101.com/

У нас есть текст

Адам имеет 2 года опыта и зарабатывает 2000 в месяц
Стив имеет 2 месяца опыта и зарабатывает 20000 в год
Питер имеет 1 год опыта и зарабатывает 25000 в год

Мы хотим получить

  • имя
  • опыт
  • зарплата

но эти значения измеряются в разных единицах, поэтому вы хотите получить название единицы.

Во-первых, вы знаете, что первым словом всегда является имя, поэтому вы можете начать свое регулярное выражение с

"^(?‹имя›\w+)"

  • ^ начать со строки
  • (?‹имя›\w+) поместить результаты из \w+ в группу под названием «имя»
  • \w+ означает все буквы, будет совпадать до тех пор, пока не будет что-то кроме буквы, например пробел или цифра, в нашем случае будет пробел

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

"^(?‹name›\w+)\s*has\s*(?‹timeAmount›\d+)\s*(?‹timeUnit›(годы?)|(месяцы?))”

  • \s* означает все пробелы
  • имеет означает слово имеет
  • \d+ означает цифры, + означает хотя бы одну, но если их больше, получить больше
  • годы? означает годы слова, но буква «s» не является обязательной (? означает необязательное значение или количество от 0 до 1)
  • | значит "или", значит есть безымянная группа лет? или неназванные групповые месяцы?

Если кто-то ничего не знает о регулярных выражениях, это может выглядеть пугающе… но, как видите, очень легко понять, что это регулярное выражение делает (или что ищет)

Точно так же я могу написать регулярное выражение для остального текста

“^(?‹имя›\w+)\s*has\s*(?‹timeAmount›\d+)\s*(?‹timeUnit›(годы?)|(месяцы?))\s*of \s*опыт\s*и\s*заработок\s*(?‹salaryAmount›\d+)\s*per\s*(?‹salaryUnit›(месяц)|(год))”

И в правой части веб-сайта regex101 вы можете увидеть, какой текст находится в какой группе.

Если вы пишете код, вы можете легко получить результаты, просто получив текст от группы. Если у вас есть текстовый редактор, такой как notepad++ или код Visual Studio, вы можете использовать группы для замены текста, например, с помощью шаблона, где $ + цифра — это номер группы

“$1 | $2 | $2”

(Эти редакторы не видят названия групп, поэтому первая группа будет называться $1, вторая $2 и т. д.)

Как видите, код Visual Studio правильно нашел наши тексты, поэтому, когда я поставил шаблон замены для замены поля

Текст будет изменен на