Это старая версия (1.14) РегулярныеВыражения.

Содержание

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

Зачем они нужны?

ОболочкаShell практически не имеет никаких встроенных средств обработки текста, кроме самых примитивных; эта задача перекладывается на внешние программы. Регулярные выражения (regular expressions) — мощный и эффективный инструмент обработки текста, совместно с возможностями оболочки позволяет конструировать простые и компактные инструменты.

Где используются

Регулярные выражения используются в таких программах, как sed (ЯзыкSed, потоковый редактор), grep (поиск текста по шаблону), awk (ЯзыкAWK, язык для обработки текстов и отчётов) и многих других. Существует две разновидности (стиля) регулярных выражений; они отличны друг от друга, и в то же время имело место взаимопроникновение. В настоящее время POSIX специфицирует BRE (basic regular expressions — базовые регулярные выражения) и ERE (extended regular expressions — расширенные регулярные выражения). Синтаксис BRE поддерживается большинством утилит Unix.

Шаблоны на основе регулярных выражений

Привязка выражений к началу и концу строки

Регулярное выражение дает совпадение со строкой в том случае, если искомый образец содержится в любом месте строки. Символы «ˆ» и «$», используемые для привязки совпадения к началу и концу строки, называют «якорями». Например, регулярное выражение `apple` совпадает со строкой `myapples`, но `ˆapple$` даст совпадение только со строкой `apple`. В то же время регулярное выражение `ˆapple` даст совпадение с `applesaregood`, а `apple$` совпадёт со строкой `redapple`.

В регулярных выражениях символ «ˆ» имеет два значения. Встретившись в самом начале выражения он работает как «якорь», привязывая образец к началу строки; выражение `ˆ[a-z]` совпадает с любой строкой, начинающейся со строчной буквы латинского алфавита. Следуя после открывающей квадратной скобки ([) символ «ˆ» инвертирует группу символов; выражение `[ˆa-z]` совпадает с любой строкой, не содержащей строчных букв латинского алфавита.

Оператор «*», атомы и подвыражения

В регулярных выражениях в отличие от шаблонов оболочки оператор «*» не даёт совпадения сам по себе, а изменяет поведение предыдущего символа. Регулярное выражение `cat*` даст совпадение со строками `ca`, `cat` и `catxyz`. Точка (.) совпадает с любым одиночным символом, а «*» изменяет его поведение так, что выражение даёт совпадение с любой последовательностью символов, в том числе и с пустой строкой. Оператор «*» действует, если быть точным, не на предыдущий символ, а на элементарную конструкцию называемую атомом (atom). Любой одиночный символ является атомом. Атом можно получить из любого выражения, заключив его в \(…\). Например, регулярное выражение `ma\(ma\)*` совпадает со строками `ma`, `mama`, `mamama`, но не совпадает с `mam`. Любое выражение, заключённое в \(…\), называется подвыражением (subexpression). Подвыражения могут быть вложенными на любую глубину.

Обратные ссылки

В регулярном выражении может присутствовать обратная ссылка (back-reference) на строку (возможно, пустую) совпавшую с подвыражением. Такую ссылку вставляют на порядковый номер подвыражения (от 1 до 9). Нумерация подвыражений начинается с единицы (`\1`, `\2` и т. д.), а подсчёт ведётся по открывающей `\(`. Например, регулярное выражение `\([0-9]\)\1` совпадёт со строками `00`, `33` и т. д. — с любой строкой, содержащей две одинаковых цифры.

На вложенные подвыражения тоже можно ссылаться. Так регулярное выражение `\([0-9]\([a-z]\)\)\1\2` совпадает со строками `0a0aa`, `1b1bb`, но со строкой `1a0aa` совпадения уже нет. Следует добавить, что обратные ссылки тоже являются атомами. Кроме оператора «*» в регулярных выражениях существует возможность уточнить количество и/или диапазон совпадений атома операторами \{x\} — точно x совпадений, \{x,\} — минимум x совпадений и \{x,y\} — от x совпадений до y совпадений включительно), где 0 ≤ xy.

Расширенные регулярные выражения (ERE)

Расширенные регулярные выражения обычно ассоциируются с egrep (или `grep -E`). В отличие от базовых регулярных выражений, в ERE для группировки и в операторах повтора не используются обратные слэши, по этой причине они читаются и записываются проще. Ещё одним отличием от BRE является наличие оператора «ИЛИ» (читается как «OR»).

Регулярное выражение `orange|apple` совпадает и со строкой `apple` и со строкой `orange`. Оператор «|» имеет низкий приоритет, поэтому регулярное выражение `a|bc` совпадает с `a` или `bc`, но не с `ac` и `bc`. Чтобы получить совпадение с `ac` и `bc` нужно поставить скобки: `(a|b)c`.

Обратные ссылки в ERE отсутствуют (в некоторых реализациях они есть как расширение). Считается, что обратные ссылки могут приводить к весьма неэффективным по производительности конструкциям; они избыточны в синтаксисе регулярных выражений и в большинстве случаев можно обойтись без них. Для удобства в ERE добавлены ещё два оператора повторения «?» и «+». Оператор «?» равнозначен {0,1}, а оператор «+» равнозначен {1,}. Заметим, что многие реализации BRE тоже «понимают» \+, \? и оператор \|.

Краткое руководство

Любой неспециальный символ c совпадает сам с собой.

\c Отменить действие специального символа c.

ˆ Привязать выражение к началу строки.

$ Привязать выражение к концу строки.

. Совпадает с любым одиночным символом.

[…] Совпадает с любым символом из ...; диапазоны задают в виде a-z.

[ˆ…] Совпадает с любым cимволом, кроме указанного в ...; можно задавать диапазон.

\n Строка с которой совпало n-ное подвыражение \(...\).

\(…\) Превращает … в подвыражение.

r* Совпадает с выражением r ноль или больше раз; совпадает с пустой строкой.

r\{x\} Совпадает с выражением r точно x раз.

r\{x,\} Совпадает с выражением r от x раз и больше.

r\{x,y\} Совпадает с выражением r от x раз до y раз (включительно).

r1 r2 Конкатенация (объединение) выражений r1 и r2.

Литература

1 The Open Group Base Specifications Issue 7 [Электронный ресурс]
Regular Expressions / The IEEE and The Open Group. — IEEE Std 1003.1, 2013 Edition. — 2013. — Режим доступа: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html, свободный.


ЯзыкиПрограммирования?