Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

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
, оператор
$
не соответствует концу строки.

• Когда в

cflags
включен
REG_NEWLINE
, то:

 • Символ конца строки не соответствует '

.
' или дополненному списку символов.

 • Оператор

^
всегда соответствует положению непосредственно за вставленным символом конца строки независимо от установки
REG_BOL
.

 • Оператор

$
всегда соответствует положению непосредственно перед вставленным символом конца строки независимо от установки
REG_EOL
.

Когда вы осуществляете построчный ввод/вывод, как в случае с

grep
, можно не включать
REG_NEWLINE
в
cflags
. Если в буфере несколько строк, и каждую из них нужно рассматривать как отдельную, с сопоставлением
^
и
$
, тогда следует включить
REG_NEWLINE
.

Структура

regex_t
по большей части непрозрачна. Код уровня пользователя может исследовать лишь один член этой структуры; остальное предназначено для внутреннего использования процедурами регулярных выражений:

typedef struct {

 /* ...здесь внутренний материал... */

 size_t re_nsub;

 /* ...здесь внутренний материал... */

} regex_t;

В структуре

regmatch_t
есть по крайней мере два члена для использования кодом уровня пользователя:

typedef struct {

 /* ...здесь возможный внутренний материал... */

 regoff_t rm_so; /* Смещение начала вложенной строки в байтах */

Поделиться:
Популярные книги

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

Печать Пожирателя 3

Соломенный Илья
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Печать Пожирателя 3

Ботаник

Щепетнов Евгений Владимирович
1. Ботаник
Фантастика:
фэнтези
боевая фантастика
4.56
рейтинг книги
Ботаник

Хозяин Стужи 2

Петров Максим Николаевич
2. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Хозяин Стужи 2

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Агенты ВКС

Вайс Александр
3. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Агенты ВКС

Приказано выжить!

Малыгин Владимир
1. Другая Русь
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.09
рейтинг книги
Приказано выжить!

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II

Я граф. Книга XII

Дрейк Сириус
12. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я граф. Книга XII

Барон Дубов 8

Карелин Сергей Витальевич
8. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 8

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Я царь. Книга XXVIII

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца