REGEX(3) | Library Functions Manual | REGEX(3) |
ИМЯ¶
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); }
СМ. ТАКЖЕ¶
Раздел руководства 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 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
15 декабря 2022 г. | Linux man-pages 6.02 |