Provided by: manpages-ru-dev_4.17.0-2_all
ИМЯ
regcomp, regexec, regerror, regfree - функции регулярных выражений POSIX
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <regex.h> int regcomp(regex_t *restrict preg, const char *restrict regex, int cflags); int regexec(const regex_t *restrict preg, const char *restrict string, size_t nmatch, regmatch_t pmatch[restrict .nmatch], int eflags); size_t regerror(int errcode, const regex_t *restrict preg, char errbuf[restrict .errbuf_size], size_t errbuf_size); void regfree(regex_t *preg);
ОПИСАНИЕ
Компилирование регулярных выражений POSIX Функция regcomp() используется для компиляции регулярного выражения в формат, который подходит для последующих поисков с помощью regexec(). regcomp() передаётся указатель на область хранения буферного шаблона preg, указатель на заканчивающуюся null строку regex и флаги cflags, используемые для определения типа компиляции. All regular expression searching must be done via a compiled pattern buffer, thus regexec() must always be supplied with the address of a regcomp()-initialized pattern buffer. cflags is the bitwise-or of zero or more of the following: REG_EXTENDED Использовать синтаксис расширенных регулярных выражений POSIX во время интерпретации regex. Если не включён этот флаг, то используется синтаксис простых регулярных выражений POSIX. REG_ICASE Не учитывать регистр. Последующие поиски regexec() с использованием данного буферного шаблона не будут зависеть от регистра. REG_NOSUB Не сообщать положение совпадений. Параметры nmatch и pmatch для regexec() игнорируются, если данный буферный шаблон был скомпилирован с этим включённым флагом. REG_NEWLINE Операторы совпадения с любым символом не совпадают с символом новой строки. A nonmatching list ([^...]) not containing a newline does not match a newline. Match-beginning-of-line operator (^) matches the empty string immediately after a newline, regardless of whether eflags, the execution flags of regexec(), contains REG_NOTBOL. Оператор сравнения по концу строки ($) совпадает с пустой строкой до символа начала строки независимо от того, что eflags содержит REG_NOTEOL. Сравнение с регулярным выражением POSIX regexec() is used to match a null-terminated string against the precompiled pattern buffer, preg. nmatch and pmatch are used to provide information regarding the location of any matches. eflags is the bitwise-or of zero or more of the following flags: REG_NOTBOL Оператор сравнения по началу строки всегда завершается с ошибкой (но смотрите описанный выше флаг компиляции REG_NEWLINE). Этот флаг может использоваться, когда в regexec() передаются отдельные части строки, и начало такой строки в данном случае не должно интерпретироваться как начало новой строки. REG_NOTEOL Оператор сравнения по концу строки всегда завершается с ошибкой (но смотрите описанный выше флаг компиляции REG_NEWLINE). REG_STARTEND Использовать pmatch[0] на входной строке начиная с байта pmatch[0].rm_so и заканчивая перед байтом pmatch[0].rm_eo. Это позволяет искать встроенные байты NUL и избегать выполнения strlen(3) для длинных строк. Здесь не используется nmatch на входных данных и не изменяется обработка REG_NOTBOL или REG_NEWLINE. Этот флаг является расширением BSD и отсутствует в POSIX. Байтовые смещения Если REG_NOSUB не установлен при компиляции буферного шаблона, то возможно получать информацию о положении совпадений. Значение pmatch должно быть определено так, чтобы иметь, по крайней мере, nmatch элементов. Они заполняются regexec() адресами внутристрочных совпадений. Смещения подвыражения, начинающегося с i-й открытой скобки, сохраняется в pmatch[i]. Адрес совпадения всего регулярного выражения сохраняется в pmatch[0] (заметим, что чтобы вернуть смещения совпадений N подвыражений, значение nmatch должно быть не менее N+1). Любые неиспользованные элементы структуры будут содержать значение -1. Структура regmatch_t, являющаяся типом pmatch, определена в <regex.h>: typedef struct { regoff_t rm_so; regoff_t rm_eo; } regmatch_t; Каждый элемент rm_so, не равный -1, показывает начальное смещение следующего совпадения наибольшей подстроки внутри заданной строки. Относительный элемент rm_eo указывает на смещение конца совпадения, которое является первым символом после совпавшего текста. Сообщение об ошибках POSIX Функция regerror используется для преобразования кодов ошибок, которые могут быть получены от regcomp() и regexec(), в строки сообщений об ошибках. В regerror передаются: код ошибки errcode, буферный шаблон preg, указатель на символьный буфер строки errbuf и размер буфера строки errbuf_size. Функция возвращает размер errbuf, который требуется для сохранения сообщения об ошибке в виде строки, оканчивающейся null. Если и errbuf, и errbuf_size не равны нулю, то errbuf заполняется первыми errbuf_size - 1 символами сообщения об ошибке и завершается байтом null ('\0'). Освобождение буфера шаблона POSIX Функция regfree() освобождает память, отведённую буферному шаблону preg во время процесса компиляции с помощью regcomp().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Функция regcomp() возвращает ноль при успешной компиляции или в противном случае код ошибки. Функция regexec() возвращает ноль при совпадении или REG_NOMATCH, если совпадений не было.
ОШИБКИ
Функция regcomp() может возвращать следующие ошибки: REG_BADBR Неправильное использование оператора обратных ссылок. REG_BADPAT Неправильное использование операторов шаблона, таких, как операторы группы или списка. REG_BADRPT Неправильное использование операторов повторения, например, использование «*» в качестве первого символа. REG_EBRACE Непарные скобки в операторах интервала. REG_EBRACK Непарные квадратные скобки в операторах списка. REG_ECOLLATE Неправильный элемент сортировки. REG_ECTYPE Неизвестное имя класса символов. REG_EEND Потенциальная ошибка. Не определена в POSIX.2. REG_EESCAPE Конечная обратная косая черта. REG_EPAREN Непарные круглые скобки в операторах группировки. REG_ERANGE Неправильное использование оператора области: например, конец области появляется прежде её начала. REG_ESIZE Скомпилированное регулярное выражение требует буферный шаблон размером, большим 64 Кб. Это не определено в POSIX.2. REG_ESPACE Для процедур регулярных выражений закончилась память. REG_ESUBREG Неправильная обратная ссылка на подвыражение.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7). ┌─────────────────────────────────────────────────┬──────────────────────┬────────────────┐ │Интерфейс │ Атрибут │ Значение │ ├─────────────────────────────────────────────────┼──────────────────────┼────────────────┤ │regcomp(), regexec() │ Безвредность в нитях │ MT-Safe locale │ ├─────────────────────────────────────────────────┼──────────────────────┼────────────────┤ │regerror() │ Безвредность в нитях │ MT-Safe env │ ├─────────────────────────────────────────────────┼──────────────────────┼────────────────┤ │regfree() │ Безвредность в нитях │ MT-Safe │ └─────────────────────────────────────────────────┴──────────────────────┴────────────────┘
СТАНДАРТЫ
POSIX.1-2001, POSIX.1-2008.
ПРИМЕРЫ
#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <regex.h> #define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0])) static const char *const str = "1) John Driverhacker;\n2) John Doe;\n3) John Foo;\n"; static const char *const re = "John.*o"; int main(void) { static const char *s = str; regex_t regex; regmatch_t pmatch[1]; regoff_t off, len; if (regcomp(®ex, re, REG_NEWLINE)) exit(EXIT_FAILURE); printf("String = \"%s\"\n", str); printf("Matches:\n"); for (unsigned int i = 0; ; i++) { if (regexec(®ex, s, ARRAY_SIZE(pmatch), pmatch, 0)) break; off = pmatch[0].rm_so + (s - str); len = pmatch[0].rm_eo - pmatch[0].rm_so; printf("#%zu:\n", i); printf("offset = %jd; length = %jd\n", (intmax_t) off, (intmax_t) len); printf("substring = \"%.*s\"\n", len, s + pmatch[0].rm_so); s += pmatch[0].rm_eo; } exit(EXIT_SUCCESS); }
СМ. ТАКЖЕ
grep(1), regex(7) Раздел руководства glibc Regular Expressions
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан aereiae <aereiae@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov <yuray@komyakino.ru>, Баринов Владимир и Иван Павлов <pavia00@gmail.com> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.