Provided by: manpages-ru-dev_4.17.0-2_all bug

ИМЯ

       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(&regex, re, REG_NEWLINE))
               exit(EXIT_FAILURE);

           printf("String = \"%s\"\n", str);
           printf("Matches:\n");

           for (unsigned int i = 0; ; i++) {
               if (regexec(&regex, 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⟩.