Искусство программирования для Unix - Реймонд Эрик Стивен
Шрифт:
Интервал:
Закладка:
Регулярные выражения описывают шаблоны, которые могут либо совпадать, либо не совпадать со строками. Простейшим средством для работы с регулярными выражениями является утилита grep(1), фильтр, который переправляет со стандартного ввода на стандартный вывод каждую строку, соответствующую указанному регулярному выражению. Форма записи регулярных выражений кратко представлена в таблице 8.1.
Существует большое количество второстепенных вариантов записи регулярных выражений.
1. Выражения-маски. Ограниченный набор соглашений по применению символов-шаблонов (wildcard), использовавшийся в ранних оболочках Unix для сопоставления имен файлов. Существует всего 3 символа-шаблона: * — соответствует любой последовательности символов (как . * в других вариантах); ? — соответствует любому единичному символу (как . в других вариантах); [. . . ] — соответствует классу символов как в других вариантах. В некоторых оболочках (csh, bash, zsh) позднее был добавлен шаблон {} для выбора подстроки. Таким образом, выражение x{a,b}c соответствует строкам хас или xbc, но не хс. В некоторых оболочках выражения-маски получили дальнейшее развитие в направлении расширения регулярных выражений.
2. Базовые регулярные выражения. Форма записи, принятая в исходной утилите grep(1) для извлечения из файла строк, соответствующих заданному регулярному выражению. Выражения этого типа также применяются в строковом редакторе ed(1) и потоковом редакторе sed(1). Профессионалы старой школы Unix считают данное выражение основной, или "унифицированной", разновидностью регулярных выражений. Пользователи, впервые столкнувшиеся с более современными инструментами, склонны использовать расширенную форму, которая описана ниже.
3. Расширенные регулярные выражения. Запись, принятая в расширенной версии grep, egrep(1) для извлечения из файла строк, соответствующих заданному регулярному выражению. Регулярные выражения в Lex и редакторе Emacs весьма близки к egrep-разновидности.
Таблица 8.1. Примеры регулярных выражений
Регулярное выражение
Соответствующая строка
"х.у"
x, за которым следует любой символ с последующим у
"х.у"
х, за которым следует точка с последующим у
"xz?y"
х, за которым следует не более одного символа z с последующим у, т.е. "ху" или "xzy", но не "xz" или "xdy"
"xz*y"
х, за которым следует любое количество символов z, за которыми сле-дуету,т.е. "ху" или "xzy" или "xzzzy",HOне "xz" или "xdy"
"xz+y"
X за которым следует один или несколько экземпляров символа z, за которыми следует у, т.е. "xzy" или "xzzy",HOHe "ху", "xz" или "xdy"
"stxyz]t"
s, за которым следует любой из символов х, у или z, за которым следует t, т.е. "sxt", "syt" или "szt",HOHe "st" или "sat"
"a[x0-9]b"
а, за которым следует либо х, либо символ в диапазоне 0 - 9, за которым следует Ь, то есть, "axb", "аОЪ" или "а4Ь",ноне "ab" или "aab"
»s[
A
xyz] t"
s, за которым следует любой символ, кроме х, у или z, за которым следует t, т.е. "sdt" или "set", но не "sxt", "syt" или "szt"
"S [
A
x0-9] t"
s, за которым следует любой символ, кроме х или символа в диапазоне 0 - 9, за которым следует t, т.е. "sit" или " smt", но не " sxt", " s 01" или "s4t"
х в начале строки, т.е. "xzy" или "хггу",ноне "yzy" или "уху"
"x$"
х в конце строки, т.е. "yzx" или "ух", но не "yxz" или " zxy"
4. Регулярные выражения языка Perl. Форма записи, принятая в regexp-функциях языков Perl и Python. Выражения этого типа являются более мощными по сравнению с egrep-вариантом.
После рассмотрения основных примеров в таблице 8.2 приведена сводка стандартных шаблонов для регулярных выражений. Следует отметить, что в таблицу не включен вариант выражений-масок, поэтому запись "для всех" означает только Зтипа: базовый, расширенный/Emacs и Perl/Python.
Стандарт POSIX для регулярных выражений вводит некоторые символьные диапазоны, такие как [[ilower;; ] ] и [ [ :digit: ] ]. Кроме того, отдельные специфические средства используют дополнительные символы-шаблоны, не описанные здесь. Однако для интерпретации большинства регулярных выражений приведенных примеров достаточно.
Таблица 8.2. Введение в операции с регулярными выражениями
Символ-шаблон
Поддерживается
Соответствующая строка
во всех
Начало евсаре-последовательности. Определяет, следует ли интерпретировать последующий знак как шаблон. Последующие буквы или цифры интерпретируются различными способами в зависимости от программы
во всех
Любой символ
во всех
Начало строки
$
во всех
Конец строки
[...]
во всех
Любой из символов, указанных в скобках
Г.. ■]
во всех
Любые символы,
кроме указанных
в скобках
*
во всех
Любое количество экземпляров предыдущего элемента
?
egrep/Emacs, Perl/Python
Ни одного или один экземпляр предыдущего элемента
+
egrep/Emacs, Perl/Python
Один или несколько экземпляров предыдущего элемента
{п}
egrep,
В точности п повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами
Perl/Python; как {n} в Emacs
{п,}
egrep,
п или более повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами
Perl/Python; как {n, } в Emacs
{ш,п}
egrep,
Минимум ш и максимум п повторений предыдущего элемента. Не поддерживается некоторыми старыми regexp-средствами
Perl/Python; как {m,n} в Emacs
1
egrep,
Элемент слева или справа. Обычно используется с некоторой формой группирующих разделителей
Perl/Python; как | в Emacs