учебники, программирование, основы, введение в,

 

Средства обработки структурированных данных http://localhost:3232/img/empty.gif

Простейшие средства обработки текстовых файлов
Согласно определению, данному в стандарте POSIX-2001, текстовым называется файл, символы которого объединены в строки длиной не более {LINE_MAX}, не содержащие нулевого символа.
Вероятно, простейшей операцией с файлами (не обязательно текстовыми) является их выдача на стандартный вывод, что обеспечивается посредством утилиты
cat [-u] [файл ...]
Несмотря на внешнюю простоту, применение служебной программы cat сопряжено с рядом тонкостей. Во-первых, опция -u предписывает передавать на стандартный вывод байты из входных файлов без задержек, это означает, в частности, отмену буферизации стандартного вывода. Во-вторых, если не указаны исходные файлы или в качестве аргумента задан знак минус, используется стандартный ввод. Минус может фигурировать в командной строке несколько раз, стандартный ввод не закрывается и не переоткрывается. Например, допустимы команды, показанные в, причем первая обеспечит ввод двух интерактивных вставок, а вторая эквивалентна третьей (читателю предлагается самостоятельно объяснить данный факт).
cat f1.txt - f2.txt - f3.txt
cat g1.txt - g2.txt - g3.txt < input.txt
cat g1.txt - g2.txt /dev/null g3.txt < input.txt
cat f1.txt f2.txt > f1.txt
Листинг 6.1. Пример использования утилиты cat.
В-третьих, нужно учитывать особенности перенаправления вывода командным интерпретатором shell. В общем случае утилита cat выдает результат конкатенации содержимого файлов-аргументов, но выполнение четвертой команды, показанной в, приведет к утрате содержимого файла f1.txt.
Для просмотра больших текстовых файлов предпочтительнее пользоваться служебной программой
more [опция ...] [файл ...]
Она разбивает вывод на страницы (экраны) и выдает их по явному указанию пользователя (например, по нажатию клавиши пробела).
Программа more - довольно мощный просмотрщик файлов со своей системой команд, которую мы, однако, описывать не будем. Отметим лишь возможности поиска и перемещения по файлам. Трактовка аргументов аналогична cat, а из опций выделим три.
-n число
Задает число строк, выдаваемых на экран.
-p команды more
Команды more выполняются после входа в очередной файл и вывода его первого экрана. Это может быть, к примеру, команда поиска.
-s
Сжимать последовательные пустые строки в одну.
Утилита more часто используется как заключительное звено конвейеров для удобного просмотра результатов.
Для просмотра нетекстовых файлов рекомендуется служебная программа
od [опция ...] [файл ...]
Она выдает на стандартный вывод содержимое исходных файлов в формате, заданном пользователем, а также в виде блоков, каждый из которых в простейшем (и наиболее употребительном) случае состоит из шестнадцати байт и занимает при выводе одну строку. В начале подобной строки располагается смещение блока от начала файла, затем следует содержимое блока. С помощью аргумента опции -A можно задать основание системы счисления для смещений (d - десятичное, o - восьмеричное, x - шестнадцатеричное, n - не выдавать смещение). Формат выдачи содержимого определяется аргументом опции -t. Помимо перечисленных типов могут быть заданы a (именованные символы), c (символы), f (вещественные числа), u (беззнаковые десятичные). За спецификациями d, f, o, u и x может следовать десятичное число - количество байт в одном значении заданного типа; за спецификацией f - символы F, D или L, указывающие тип вещественных чисел (float, double или long double, соответственно), а за спецификациями d, o, u, x - спецификаторы целочисленного типа C (char), S (short), I(int) или L (long).
Рассмотрим пример. Пусть файл ascii.tab содержит байты от
od -A x -t a ascii.tab
Листинг 6.2. Пример использования утилиты od.
Листинг 6.3. Возможный результат использования утилиты od.
Полезная возможность - взглянуть на начало файла, чтобы понять, нуждается ли он в более детальном изучении. Эта возможность реализуется служебной программой head:
head [-n число] [файл ...]
Утилита head копирует на стандартный вывод указанное число (по умолчанию - 10) начальных строк исходных файлов (или весь файл, если он слишком короткий).
"Симметричная" служебная программа - tail
tail [-f] [-c число | -n число] [файл]
выдает на стандартный вывод конец исходного файла, начиная с указанного места. Если задана опция -c, единицей измерения является байт, если -n - строка. Числовой аргумент опции может быть задан со знаком; знак + означает, что отсчет байт (строк) идет от начала файла.
Опция -f полезна для слежения за растущими файлами, в которые пишет какой-либо другой процесс. При наличии этой опции утилита tail не завершается по достижении конца файла, но ждет появления новых данных и выводит их.
Рассмотрим примеры. Команда
tail -f f1
выдаст последние десять строк файла f1, за которыми последуют строки, добавленные к файлу f1 в промежуток времени между запуском и терминированием утилиты tail.
В качестве примера совместного использования служебных программ head и tail приведем фрагмент одного из командных файлов ОС Linux.
echo "Reloading automounter: checking\
for changes ... "
TMP=/var/run/autofs.tmp
getmounts > $TMP
for i in /var/run/autofs.*.pid
do
pid=`head -n 1 $i 2>/dev/null`
[ "$pid" = "" ] && continue
command=`tail -n +2 $i`
if ! grep -q "^$command" $TMP
then
echo "Stopping automounter: $command"
kill -USR2 $pid
fi
done
rm -f $TMP
Листинг 6.4. Пример использования служебных программ head и tail.
Отметим, что здесь утилиты head и tail делят исходный файл "по-братски": первой достается первая строка, второй - все остальные.
Служебная программа pr
pr [+номер_страницы] [-число_столбцов]
[-adFmrt] [-e[символ][число]]
[-h заголовок] [-i[символ][число]]
[-l число_строк] [-n[символ][ширина]]
[-o отступ] [-s[символ]] [-w ширина]
[файл ...]
является фильтром для печати и оформления страниц. По умолчанию выдача разбивается на страницы, каждая из которых содержит в пятистрочном заголовке свой номер, дату, время и имя файла. Длина страницы 66 строк, включая пять пустых строк хвостовика.
Утилита pr обрабатывает следующие аргументы командной строки.
+номер_страницы
Начать вывод со страницы с заданным номером (по умолчанию с первой).
-число_столбцов
Вывод в заданное число столбцов (по умолчанию в один). При выводе в несколько столбцов автоматически действуют опции -e и -i. Этот аргумент несовместим с опцией -m.
-a
Выдача в несколько столбцов с упорядочением по строкам. Например, если заказана печать в два столбца, первая исходная строка попадает в первый столбец, вторая - во второй, третья - снова в первый и т.п.
-d
Выдача через строку.
-e[символ][число]
Установка табуляции через заданное число позиций, начиная с первой. Символы табуляции во входном файле развертываются в соответствующее количество пробелов. Если задан любой нецифровой символ, он трактуется как символ табуляции во входном файле.
-F
Применять символы перехода к новой странице (по умолчанию переход на новую страницу осуществляется при помощи последовательности переводов строк).
-h заголовок
Использовать заданный заголовок (по умолчанию в качестве заголовка выступает имя исходного файла).
-i[символ][число]
При выводе, где это возможно, последовательности пробельных символов заменяются символами табуляции, при условии, что табуляции установлены через заданное число позиций, начиная с первой. Если задан любой нецифровой символ, он выводится в качестве символа табуляции.
-l число_строк
Установка длины страницы (по умолчанию 66 строк).
-m
Слияние и печать всех файлов параллельно, по одному в столбце. Реализация должна поддерживать слияние по крайней мере девяти файлов.
-n[символ][ширина]
Производится нумерация строк. Под номер отводится поле заданной ширины (по умолчанию - 5). Если задан любой нецифровой символ, то он присоединяется к номеру строки, отделяя ее от последующего текста (подразумеваемым значением является символ табуляции).
-o отступ
Установка отступа слева на заданное число позиций. Количество позиций в каждой строке есть сумма ширины и отступа.
-p
Пауза перед выдачей каждой страницы, если вывод назначен на терминал (pr включит звонок и будет ждать нажатия клавиши возврата каретки).
-r
Подавление диагностических сообщений при ошибках открытия файлов.
-s[символ]
Разделение столбцов единственным символом (по умолчанию - табуляцией), а не соответствующим количеством пробелов.
-t
Подавление выдачи пятистрочного идентифицирующего заголовка и такого же размера хвостовика, сопровождающих обычно каждую страницу.
-w ширина
Установка ширины строки (по умолчанию - 72 позиции). Эта опция действует только при печати в несколько столбцов.
В качестве примера использования служебной программы pr приведем конвейер, позволяющий получить пронумерованный список всех файлов текущего каталога:
ls -a | pr -2 -a -l 24 -n' '3 -h "Список\
файлов каталога $(pwd)"
Начальный фрагмент результата может выглядеть так, как показано в.
2003-10-17 17:24 Список файлов каталога
/var/tmp Page 1
1 . 2 ..
3 Blank.ReS 4 Make45.ReS
5 Make46.ReS 6 from_cvs
7 gcc-20032204 8 gcc-3.4-16-jun-2003
9 htdocs 10 rpm-tmp.29785
. . .
Листинг 6.5. Начальный фрагмент возможного результата работы служебной программы pr.
Для подсчета числа символов, слов и строк в файлах служит утилита wc:
wc [-c | -m] [-w] [-l] файл ...
Опция -c предписывает подсчитывать байты, -m - символы, -w - слова, -l - строки. По умолчанию подсчитываются символы, слова и строки. Если в командной строке задано несколько файлов, помимо результатов для каждого из них выводятся также суммарные показатели.
Рассмотрим пример. Предположим, что результаты, показанные в, сохранены в файле ascii.od. Тогда команда, приведенная в, выдаст результат, показанный в.
wc ascii.od
Листинг 6.6. Пример использования утилиты wc.
9 137 575 ascii.od
Листинг 6.7. Возможный результат использования утилиты wc.
Иными словами, в указанном файле 575 символов, 137 слов, расположенных на 9 строках.
Служебная программа sort
sort [-m] [-o выходной_файл] [-bdfinru]
[-t символ] [-k определение_ключа] ...
[файл ...]

sort -c [-bdfinru] [-t символ]
[-k определение_ключа] [файл]
в зависимости от заданных опций выполняет одно из трех возможных действий:

  • сортировку строк всех исходных файлов с записью результата в выходной файл;
  • слияние всех исходных (предварительно отсортированных) файлов с записью результата в выходной файл;
  • проверку того, что единственный исходный файл действительно отсортирован.

При упорядочении используется один или несколько ключей сортировки, выделяемых из каждой вводимой строки. По умолчанию ключ сортировки один - вся строка, а порядок является лексикографическим.
Следующие опции управляют порядком работы утилиты sort.
-c
Проверить, является ли (единственный) исходный файл уже отсортированным. В выходной файл ничего не записывается, результат работы определяется по коду завершения (0 - успешное завершение, 1 - данные в файле не упорядочены должным образом, больше единицы - зафиксирована ошибка).
-m
Слияние исходных файлов, которые предполагаются отсортированными.
-o выходной_файл
Результат направляется не на стандартный вывод, а в выходной_файл, который может совпадать с одним из исходных.
-u
Опция уникальности: из всех совпадающих строк выводить только одну, при наличии опции -c контролировать отсутствие строк с совпадающими ключами сортировки.
Следующие опции изменяют подразумеваемый способ сравнения. Если они употреблены независимо от определения ключей сортировки, то диктуемые ими правила действуют глобально, на все ключи.
-d
"Словарный" порядок: при сравнении являются значимыми только буквы, цифры и пробельные символы.
-f
При сравнении преобразовывать малые буквы в большие.
-i
При сравнении игнорировать непечатные символы.
-n
Числовое сравнение. Ограничить ключ сортировки начальной числовой цепочкой, которая может содержать пробельные символы, знак минус, цифры, символ основания системы счисления и разделители тысяч.
-r
Заменить результат сравнения на противоположный.
Следующие опции изменяют трактовку разделителей полей.
-b
Игнорировать начальные пробельные символы при определении начала и конца ключей сортировки. Если опция -b указана перед первой опцией -k, она воздействует на все ключи, снабженные опцией -k.
-t символ
Использовать заданный символ как разделитель полей. Разделитель не является частью поля (хотя и может входить в ключ сортировки). Каждое вхождение разделителя значимо, т. е. два рядом стоящих разделителя ограничивают пустое поле. В отсутствие опции -t подразумеваемыми разделителями становятся пробельные символы, точнее, максимальная непустая последовательность таких символов, а в поле включаются предшествующие ему разделители.
Ключи сортировки определяются с помощью опции -k. Определение ключа имеет следующий формат:
начало_поля[тип][,конец_поля[тип]]
Ключевое поле охватывает все позиции - от начальной до конечной, которые задаются, соответственно, как
номер_поля[.первый_символ]
номер_поля[.последний_символ]
Тип - это один из модификаторов b, d, f, i, n, r. Модификатор b ведет себя аналогично опции -b, но применяется только к той границе ключа, после которой он указан. Остальные модификаторы также аналогичны одноименным опциям, но воздействуют на ключ в целом.
Если указано несколько ключей сортировки (согласно стандарту, реализацией должно поддерживаться по крайней мере девять вхождений опции -k), то более поздние используются только в случае равенства более ранних. Если значения ключей сортировки двух строк совпадают, строки упорядочиваются с учетом всех символов.
http://localhost:3232/img/empty.gifПриведем примеры использования служебной программы sort. Автор хранит данные о собственном кровяном давлении в виде файла pp.txt, содержащего пять столбцов: дата, время, верхнее давление, нижнее давление, пульс . Естественно, строки добавляются к файлу в хронологическом порядке. Чтобы упорядочить их по убыванию верхнего давления (третий столбец), можно воспользоваться командой, показанной в. Возможный результат приведен в.
12.05.2000 17:30 200 125 120
15.05.2000 17:00 130 80 70
17.05.2000 10:30 150 90 70
17.05.2000 21:45 154 99 74
19.05.2000 10:05 158 83 89
21.05.2000 21:00 161 104 64
22.05.2000 21:00 147 104 69
. . .
Листинг 6.8. Пример исходных данных для служебной программы sort.
sort -r -k 3,3 pp.txt
Листинг 6.9. Пример использования служебной программы sort.
12.05.2000 17:30 200 125 120
18.11.2000 19:30 172 107 68
04.07.2002 09:00 170 98 85
30.10.2001 13:00 168 94 88
27.12.2000 20:30 166 98 69
23.05.2002 10:00 166 104 56
22.05.2002 10:00 166 103 57
23.10.2001 11:00 165 88 88
. . .
Листинг 6.10. Возможный результат работы служебной программы sort.
Если ключи сортировки равны, строки упорядочиваются с учетом всех байт. В рассматриваемом примере это не очень удобно, поскольку они начинаются с номера дня в месяце. Более естественно либо расширить ключ сортировки путем охвата полей нижнего давления и пульса, либо сделать эти поля дополнительными ключами. Оба варианта показаны в, а результат сортировки - в. Отметим, что второй вариант предпочтительнее, поскольку он устойчив к ошибкам выравнивания столбцов.
# Первый вариант - ключ сортировки покрывает
# несколько полей sort -r -k 3,5 pp.txt
# Второй вариант - используется несколько
# ключей сортировки
# sort -n -r -k 3,3 -k 4,4 -k 5,5 pp.txt
Листинг 6.11. Два варианта использования служебной программы sort.
12.05.2000 17:30 200 125 120
18.11.2000 19:30 172 107 68
04.07.2002 09:00 170 98 85
30.10.2001 13:00 168 94 88
23.05.2002 10:00 166 104 56
22.05.2002 10:00 166 103 57
27.12.2000 20:30 166 98 69
23.10.2001 11:00 165 88 88
. . .
Листинг 6.12. Результат работы служебной программы sort с несколькими ключами сортировки.
Предположим теперь, что данные о давлении и пульсе разбиты по годам и в уже отсортированном виде хранятся в файлах pp2000.sorted, pp2001.sorted и т.д. Для их слияния можно воспользоваться командной строкой или циклом из. Опять-таки второй вариант предпочтительнее по причине его устойчивости к количеству исходных файлов.
# Первый вариант слияния файлов
# sort -m -o pp.sorted -n -r -k 3,3 -k 4,4
# -k 5,5 pp2*.sorted
# Второй вариант слияния файлов
> pp.sorted
for f in pp2*.sorted
do
sort -m -o pp.sorted -n -r -k 3,3\
-k 4,4 -k 5,5 $f pp.sorted
done
Листинг 6.13. Два варианта слияния файлов с помощью служебной программы sort.
Проверить правильность слияния можно с помощью команд, показанных в.
name=pp.sorted
if sort -c -r -n -k 3,3 -k 4,4 -k 5,5 $name
then
echo Данные в файле $name отсортированы\
верно
elif
echo Данные в файле $name отсортированы\
неверно
fi
Листинг 6.14. Проверка правильности упорядоченности строк в файле с помощью служебной программы sort.
Содержимое файлов f1 и f2 сортирует команда , применяющая в качестве ключа второй непробельный символ второго поля.
sort -k 2.2b,2.2b f1 f2
Листинг 6.15. Пример использования служебной программы sort с модификаторами в определении ключей.
Отсортировать базу данных пользователей по числовым значениям идентификаторов пользователей (третье поле, поля разделяются символом :) можно посредством команды, показанной в.
sort -t ':' -k 3,3n /etc/passwd
Листинг 6.16. Пример использования служебной программы sort с опцией -t.
Выдать содержимое уже отсортированного файла   f.sorted, выводя лишь первую из строк с одинаковыми третьими полями, поможет комбинация опций -m и -u.
sort -um -k 3.1,3 f.sorted
Листинг 6.17. Пример использования служебной программы sort с опциями -m и -u.
В ситуациях, когда есть две версии текста - "правильная" и "неправильная" (например, исходные тексты работающей и неработающей программ), полезно понять, чем они отличаются. Для этого предназначена служебная программа diff:
diff [-c | -e | -f | -C число] [-br]
файл1 файл2
Утилита diff сравнивает содержимое исходных файлов и выдает на стандартный вывод список изменений, которые необходимо произвести, чтобы преобразовать файл1 в файл2. Она поддерживает следующие опции.
-b
Игнорировать пробельные символы в конце строк; остальные цепочки пробельных символов считать равными.
-c
Производить вывод в формате, обеспечивающем три строки контекста.
-C число
Производить вывод в формате, обеспечивающем заданное число строк контекста.
-e
Производить вывод в формате, пригодном для подачи на вход редактора ed и преобразования файла1 в файл2.
-f
Производить вывод в альтернативном формате, напоминающем -e, но в обратном порядке и не предназначенном для подачи на вход редактора ed.
-r
Если файл1 и файл2 представляют собой каталоги, применять утилиту diff рекурсивно к одноименным и однотипным обычным файлам и каталогам. Если только один из файлов является каталогом, в нем сравнивается "тезка" другого исходного файла.
В качестве примера использования служебной программы diff сравним две версии бинарных утилит . Начальный фрагмент результата показан в. Видно, что различия, по сути, сводятся к добавлению новых файлов.
diff -r binutils-2_14 binutils-2_14-branch
Листинг 6.18. Пример использования служебной программы diff.
Листинг 6.19. Фрагмент возможного результата работы служебной программы diff.
Если нужно проверить два файла на совпадение, предпочтительнее воспользоваться не утилитой diff, а более простой и быстрой служебной программой cmp:
cmp [-l | -s] файл1 файл2
По умолчанию cmp выдает на стандартный вывод номера байта и строки, где встретилось первое отличие. Опция -l предписывает выдавать все отличия в виде номеров и содержимого (восьмеричного) байт. По опции -s отличия не выдаются, возвращается лишь соответствующий код завершения (0 - файлы совпадают, 1 - файлы различаются, больше единицы - зафиксирована ошибка).
Если в продолжение примера с утилитой diff сравнить две версии файла version.h посредством cmp , результат будет выглядеть так, как показано в.
cmp -l binutils-2_14/bfd/version.h\
binutils-2_14-branch/bfd/version.h
Листинг 6.20. Пример использования служебной программы cmp.
30 60 61
31 66 60
32 61 60
33 62 67
Листинг 6.21. Возможный результат работы служебной программы cmp.
Еще одно средство выявления различий (и, кроме того, совпадений) текстовых файлов - служебная программа comm:
comm [-123] файл1 файл2
Она читает файл1 и файл2 (их содержимое должно быть отсортировано в лексикографическом порядке) и выводит результаты в три столбца:

  1. строки, входящие только в файл1;
  2. строки, входящие только в файл2;
  3. строки, входящие в оба файла.

Опции -1, -2 или -3 подавляют вывод соответствующих столбцов. Так, comm -12 выводит строки, общие для обоих файлов, comm -23 - имеющиеся только в файле1, comm -123 не выводит ничего.
В стандарте POSIX-2001 приведен следующий пример использования служебной программы comm. Пусть файл xcu содержит отсортированный список утилит, вошедших в данный стандарт, файл xpg3 - аналогичный список для спецификации X/Open Portability Guide, Issue 3, а файл svid89 представляет собой отсортированный список утилит из System V Interface Definition Third Edition. Тогда конвейер, показанный в, выдаст список служебных программ, фигурирующих в спецификациях XPG3 и SVID, но не вошедших в стандарт IEEE Std1003.1-2001.
comm -12 xpg3 svid89 | comm -23 - xcu
Листинг 6.22. Пример использования служебной программы comm.
Для контроля целостности файлов (не являющегося, впрочем, криптостойким), предназначена служебная программа
cksum [файл ...]
Для каждого файла - аргумента она выдает на стандартный вывод подсчитанную по стандарту ISO/IEC 8802-3:1996 (Ethernet) контрольную сумму, количество байт и имя.
Применение утилиты cksum - полезный элемент оформления поставляемых приложений.
Регулярные выражения
Понятие регулярного выражения (РВ) - одно из важнейших для программ обработки текстовых файлов. Согласно стандарту POSIX-2001, регулярное выражение - это шаблон, служащий для выборки определенных цепочек символов из множества подобных цепочек. Говорят, что выбранные цепочки удовлетворяют РВ (успешно с ним сопоставляются).
Когда хотят подчеркнуть составной характер РВ, используют термин "полное регулярное выражение". Под этим понимается шаблон, заданный как конкатенация одного или нескольких элементарных РВ.
Стандарт накладывает на сложность (полных) РВ единственное ограничение: реализация должна поддерживать любое РВ, длина которого не превышает 256 байт.
Оговаривается, что при наличии альтернатив выбирается самая левая из возможных цепочек, имеющая к тому же максимальную длину.
Различают базовые (БРВ) и расширенные регулярные выражения (РРВ). В большинстве случаев используются БРВ, они и будут описаны в первую очередь.
Минимальным элементом БРВ являются односимвольные БРВ, т. е. БРВ, которым удовлетворяют цепочки из одного символа. Односимвольные БРВ строятся по следующим правилам.

  1. Обычный символ (не входящий в перечень из следующего пункта) - это односимвольное   БРВ, которое успешно сопоставляется с указанным символом.
  2. Если за символом \ следует любой специальный символ, то последний теряет свой специальный смысл. Данная комбинация определяет односимвольное   БРВ, успешно сопоставляющееся со специальным символом. Специальными символами являются:
  • . [ \

Эти символы имеют специальный смысл, за исключением случая, когда они заключены в квадратные скобки.
*
Символ имеет специальный смысл, если он не заключен в квадратные скобки или не является первым символом БРВ.
^
Символ имеет специальный смысл в начале полного БРВ или в квадратных скобках сразу после открывающей скобки.
$
Символ имеет специальный смысл в конце полного БРВ.

  1. Точка (.) - односимвольное   БРВ, успешно сопоставляющееся с любым символом.
  2. Непустая цепочка символов, заключенная в квадратные скобки [ ] представляет собой односимвольное   БРВ, которое успешно сопоставляется с любым символом из этой цепочки. Если цепочка начинается с символа ^, то БРВ успешно сопоставляется с любым не входящим в данный набор символом.

Внутри квадратных скобок можно использовать также конструкции, описываемые ниже.
Диапазон символов можно задать с помощью знака -. Например, БРВ   [0-9] эквивалентно [0123456789]. Минус теряет свой специальный смысл, если он стоит в начале (допустимо после ^) или в конце цепочки символов в квадратных скобках либо использован в качестве границы диапазона. Так, БРВ   [%--] успешно сопоставляется со всеми символами от процента до минуса включительно.
Закрывающая квадратная скобка не рассматривается как окончание цепочки символов, если она стоит вначале (быть может, после ^). Таким образом, БРВ   []a-f] определяет либо закрывающую квадратную скобку, либо любой символ от a до f включительно.
Стандарт POSIX-2001 предусматривает поддержку классов символов (таких, например, как буквы, цифры, знаки пунктуации, пробельные символы, управляющие символы и т.д.). Класс символов задается своим именем, заключенным в квадратные скобки с двоеточиями. Должны поддерживаться по крайней мере следующие классы:
[:alnum:] [:cntrl:] [:lower:] [:space:]
[:alpha:] [:digit:] [:print:] [:upper:]
[:blank:] [:graph:] [:punct:] [:xdigit:]
Например, БРВ [^[:alnum:]] удовлетворяют символы, отличные от букв и цифр.
В некоторых языках элемент алфавитного сравнения может задаваться несколькими символами. Такие элементы следует заключать в квадратные скобки с точками: [[.ch.]].
Если определены классы элементов, эквивалентных при алфавитном сравнении, то подобный класс можно задать, заключив любой его элемент в квадратные скобки со знаками равенства: ([= и =]).
Таковы правила построения заключенных в квадратные скобки односимвольных БРВ.
Построение многосимвольных   БРВ из односимвольных регламентируется следующим образом.

  1. В состав БРВ могут входить подвыражения ( в том числе вложенные), заключенные в экранированные круглые скобки: \( и \). Подвыражение в скобках успешно сопоставляется с теми же цепочками, что и без скобок.
  2. На подвыражения допускаются обратные ссылки вида \n (где n - цифра от 1 до 9). Обратной ссылке удовлетворяет такая же цепочка символов, что была успешно сопоставлена подвыражением, открывающимся экранированной скобкой номер n, считая от начала полного БРВ. Например, БРВ \(.\)\1 удовлетворяют пары одинаковых символов.
  3. За односимвольными БРВ, подвыражениями и обратными ссылками может следовать звездочка. Такая конструкция успешно сопоставляется с любым (в частности, с нулевым) числом последовательных вхождений упомянутых БРВ. Например, шаблону \(.*\)\1 удовлетворяют пары стоящих рядом одинаковых цепочек символов.
  4. За односимвольными   БРВ, подвыражениями и обратными ссылками может следовать запись вида \{m\}, \{m,\} или \{m,n\}, называемая интервальным выражением. Такая конструкция успешно сопоставляется с определенным числом вхождений упомянутых БРВ. Значения m и n должны удовлетворять неравенствам
  5. Конкатенация компонентных БРВ есть БРВ, которое успешно сопоставляется с конкатенацией цепочек, удовлетворяющих каждому из компонентных БРВ.
  6. На БРВ можно наложить ограничение, чтобы успешно сопоставленная   подцепочка символов примыкала к одной или обоим границам анализируемой цепочки (произвести фиксацию границ). Если в начале БРВ стоит символ ^ (фиксатор начала), то сопоставление должно выполняться с начала цепочки.   Если в конце БРВ стоит символ $ (фиксатор конца), то сопоставление должно выполняться до конца цепочки. Например, БРВ ^\(.*\)\1$ успешно сопоставляется с цепочками символов, состоящими из двух одинаковых подцепочек.

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

  1. В число специальных символов дополнительно входят круглые скобки, открывающая фигурная скобка, а также символы +, ?, |.
  2. Для группирования (выделения подвыражений) используются неэкранированные круглые скобки.
  3. Отсутствуют обратные ссылки.
  4. Добавлены два повторителя: плюс обозначает любое ненулевое число последовательных вхождений; знак вопроса - нуль или одно вхождение.
  5. Для выделения интервальных выражений используются неэкранированные фигурные скобки.
  6. Введена операция логического ИЛИ, которая обозначается символом | и имеет низший приоритет. Результат сопоставляется с цепочками, удовлетворяющими хотя бы одному из операндов. Например, РРВ   a((bc)|d) успешно сопоставляется и с цепочкой символов   "abc", и с "ad". Односимвольные РРВ, разделенные символом | и заключенные в круглые скобки, трактуются как односимвольные.

Таковы правила построения и обработки регулярных выражений, зафиксированные в стандарте POSIX-2001. Отметим, что базовые регулярные выражения не являются подмножеством расширенных, хотя число специфических особенностей БРВ невелико.

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика