Kniga-Online.club
» » » » Linux программирование в примерах - Роббинс Арнольд

Linux программирование в примерах - Роббинс Арнольд

Читать бесплатно Linux программирование в примерах - Роббинс Арнольд. Жанр: Интернет год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

echo

~arnold/.p*

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

Регулярные выражения являются способом описания текстовых шаблонов для сопоставления. Если вы вообще сколько-нибудь использовали GNU/Linux или Unix, вы без сомнения знакомы с регулярными выражениями: они являются фундаментальной частью инструментария программиста Unix. Они неотъемлемы от таких повседневных программ, как grep, egrep, sed, awk, Perl, а также редакторы ed, vi, vim и Emacs. Если вы вообще не знакомы с регулярными выражениями, мы рекомендуем ознакомиться с некоторыми из книг или URL, указанных в разделе 12.9 «Рекомендуемая литература».

POSIX определяет два вида регулярных выражений: базовый и расширенный. Программы типа grep, sed и строчный редактор ed используют базовые регулярные выражения. Программы типа egrep и awk используют расширенные регулярные выражения. Следующие функции дают вам возможность использовать в своих программах любой вид.

#include <sys/types.h> /* POSIX */

#include <regex.h>

int regcomp(regex_t *preg, const char *regex, int cflags);

int regexec(const regex_t *preg, const char *string, size_t nmatch,

 regmatch_t pmatch[], int eflags);

size_t regerror(int errcode, const regex_t *preg,

 char *errbuf, size_t errbuf_size);

void regfree(regex_t *preg);

Чтобы сопоставить регулярное выражение, нужно сначала откомпилировать строчную версию регулярного выражения. Компиляция преобразует регулярное выражение во внутренний формат. Затем откомпилированная форма исполняется для строки для проверки, совпадает ли она с первоначальным регулярным выражением. Функции следующие.

int regcomp(regex_t *preg, const char *regex, int cflags)

Компилирует регулярное выражение regex во внутреннее представление, сохраняя его в структуре regex_t, на которую указывает preg. cflags контролирует процесс компиляции; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.7

int regexec(const regex_t *preg, const char *string, size_t nmatch,

 regmatch_t pmatch[], int eflags)

Выполняет откомпилированное регулярное выражение в *preg в строке string eflags контролирует способ выполнения; ее значение равно 0 или побитовому ИЛИ одного или более флагов из табл. 12.8. Вскоре мы обсудим другие аргументы.

size_t regerror(int errcode, const regex_t *preg,

 char *errbuf, size_t errbuf_size)

Преобразует ошибку, возвращенную regcomp() или regexec(), в удобочитаемую строку.

void regfree(regex_t *preg)

Освобождает динамическую память, используемую откомпилированным регулярным выражением в *preg.

Заголовочный файл <regex.h> определяет ряд флагов. Некоторые используются с regcomp(); другие используются с regexec(). Однако, все они начинаются с префикса 'REG_'. В табл. 12.7 перечислены флаги для компиляции регулярных выражений с помощью regcomp().

Таблица 12.7. Флаги для regcomp()

Константа Значение REG_EXTENDED Использовать расширенные регулярные выражения. По умолчанию используются базовые регулярные выражения REG_ICASE Сопоставление regexec() игнорирует регистр символов REG_NEWLINE Операторы, заменяющие любой символ, не включают символ конца строки REG_NOSUB Информация о начале и конце вложенною шаблона не требуется (см текст)

Флаги для сопоставления регулярных выражений с помощью regexec() приведены в табл. 12.8.

Таблица 12.8. Флаги дли regexec()

Константа Значение REG_NOTBOL Оператор ^ (начало строки) не сопоставляется REG_NOTEOL Оператор $ (конец строки) не сопоставляется

Флаги REG_NEWLINE, REG_NOTBOL и REG_NOTEOL взаимодействуют друг с другом. Это немного запутано, поэтому мы будем продвигаться небольшими шажками.

• Когда в cflags не включен REG_NEWLINE, символ конца строки действует в качестве обычного символа. С ним может быть сопоставлен метасимвол '.' (любой символ), а также дополненные списки символов ('[^...]'). При этом $ не сопоставляется немедленно с началом вставленного символа новой строки, а ^ не сопоставляется немедленно с его концом.

• Когда в eflags установлен REG_NOTBOL, оператор ^ не соответствует началу строки. Это полезно, когда параметр string является адресом символа в середине сопоставляемого текста.

• Сходным образом, когда в eflags установлен REG_NOTEOL, оператор $ не соответствует концу строки.

Перейти на страницу:

Роббинс Арнольд читать все книги автора по порядку

Роббинс Арнольд - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Linux программирование в примерах отзывы

Отзывы читателей о книге Linux программирование в примерах, автор: Роббинс Арнольд. Читайте комментарии и мнения людей о произведении.


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

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*