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; /* Смещение начала вложенной строки в байтах */