Регулярные выражения (regex)
100%

Продвинутый Text-Fu · Урок 1

Регулярные выражения (regex)

Узнайте, как якоря, наборы символов, повторения и разновидности regex управляют поиском по текстовым шаблонам.

Регулярные выражения, часто сокращаемые до regex, описывают текстовые шаблоны. Их используют такие инструменты, как grep, sed и awk, однако поддерживаемый синтаксис может различаться, поэтому всегда учитывайте конкретный инструмент и разновидность регулярных выражений.

GNU grep по умолчанию использует базовые регулярные выражения (BRE), а с параметром -E — расширенные (ERE). В этом уроке сначала рассматриваются конструкции, общие для обоих вариантов, а затем — распространённые дополнения ERE.

В примерах будем использовать следующий текст:

sally sells seashells
by the seashore

Сопоставление с буквальным текстом

Большинство обычных символов обозначают сами себя. Шаблон seashells выбирает строку, в которой эта последовательность встречается в любом месте:

$ grep 'seashells' sample.txt
sally sells seashells

Заключайте регулярные выражения в кавычки, чтобы оболочка не раскрыла и не разделила их до передачи инструменту поиска. Регулярные выражения также отличаются от подстановки путей в оболочке: в regex символ * повторяет предшествующий элемент, а в шаблоне оболочки * сам служит подстановочным знаком для последовательности символов в пути.

Что делает * в регулярном выражении ab*?

Привязка совпадения

Вне выражения в квадратных скобках символ ^ в начале шаблона привязывает совпадение к началу строки:

^by

Якорь $ соответствует концу строки:

seashore$

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

^by the seashore$

Какой шаблон соответствует только строке, полный текст которой — by the seashore?

Сопоставление с одним символом

В обычном построчном режиме regex точка соответствует одному символу:

b.

Такой шаблон соответствует by, но также может совпасть с ba или b7. Одинокая b не подойдёт, поскольку после неё требуется ещё один символ. Для поиска самой точки экранируйте её как \. или поместите в подходящее выражение в квадратных скобках.

Какая строка не соответствует шаблону полной строки ^b.$?

Выражения в квадратных скобках

Выражение в квадратных скобках соответствует одному символу из указанного набора:

s[ae]lls

В этой позиции шаблон может соответствовать sells или salls.

Если ^ стоит первым символом после [, он инвертирует набор:

s[^e]lls

Этот шаблон соответствует salls, но не sells, поскольку символ после первой s не может быть e.

Чему соответствует [^e]?

Диапазоны позволяют описать символы между двумя границами:

d[a-c]g

Шаблон может соответствовать dag, dbg или dcg. Поведение диапазонов способно зависеть от правил сортировки текущей локали. Классы символов [[:lower:]], [[:upper:]] и [[:digit:]] часто яснее выражают намерение.

Повторение и объединение шаблонов

И в BRE, и в ERE символ * означает ноль или более повторений предшествующего элемента:

seashells*

Шаблон соответствует seashell, после которого может идти любое количество дополнительных символов s, включая ноль. В режиме ERE, включаемом через grep -E, распространены следующие операторы:

  • +: одно или более повторений.
  • ?: ноль или одно повторение.
  • |: выражение слева или выражение справа.
  • (...): группировка выражений.

Например:

$ grep -E '^(cat|dog)s?$' animals.txt

Команда выбирает строки, целиком равные cat, cats, dog или dogs. В режиме BRE правила экранирования этих операторов отличаются, поэтому не переносите шаблон из одной разновидности regex в другую, не сверившись с синтаксисом.

Какая команда включает расширенный синтаксис regex для шаблона ^(cat|dog)s?$?

Закрепить выбор текста с помощью инструментов Linux можно в практических лабораториях:

  1. Поиск текста с помощью grep в Linux — вы научитесь искать текст командой grep, выводить номера строк, применять якоря ^ и $, а также использовать базовые и расширенные регулярные выражения для сложного поиска по шаблону.
  2. Обработка текста и регулярные выражения — познакомьтесь с инструментами grep, sed и awk и примените регулярные выражения для эффективной обработки текста в Linux.
  3. Извлечение адресов и чисел — используйте grep и регулярные выражения для извлечения адресов электронной почты и чисел из файла.

Урок завершён

Вы завершили Регулярные выражения (regex)

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

  • Отличать операторы regex от подстановочных знаков путей в оболочке.

  • Привязывать совпадение к началу или концу строки.

  • Сопоставлять один символ с помощью точки или выражения в скобках.

  • Инвертировать наборы и применять классы символов с учётом локали.

  • Осознанно выбирать синтаксис BRE или ERE.

Сохраните прогресс

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

Создать бесплатный аккаунт
Следующий Урок
Назад к Продвинутый Text-Fu