НАЗВА

regcomp, regexec, regerror, regfree - функції регулярних виразів POSIX

СТИСЛИЙ ОГЛЯД

#include <sys/types.h>
#include <regex.h>

int regcomp(regex_t preg, const char regex, int cflags);
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);

КОМПІЛЯЦІЯ РЕГУЛЯРНИХ ВИРАЗІВ POSIX

regcomp служить для "компіляції" регулярного виразу і надання йому форми, придатної для подальших пошуків за допомогою regexec.

regcomp візьме як аргументи: preg - покажчик на область буферу, де компільований шаблон буде збережено, regex - покажчик на ланцюжок з нульовим закінченням і cflags - прапорцi, використовувані для визначення типу компіляції.

Усі пошуки регулярних виразів повинні виконуватись через компільований буферний шаблон, тож regexec завжди отримуватиме адресу буферу, у якому знаходиться бінарний шаблон, компільований regcomp.

cflags може бути порозрядним АБО одного або декількох з наступного:

REG_EXTENDED : Використовувати синтаксис розширених регулярних виразів POSIX під час інтерпретації regex. Якщо цей прапор не включено, то використовується синтаксис простих регулярних виразів POSIX.

REG_ІCASE : Не враховувати регістру літер. Наступні пошуки regexec з використанням шаблона у буфері не будуть залежати від регістру.

REG_NOSUB : Не вимагати підтримки адресації до частин ланцюжків всередині збігів. Параметри nmatch і pmatch для regexec ігноруються, якщо даний буферний шаблон був скомпільований з цим прапором.

REG_NEWLІNE : Оператори, що збігаються з будь-якими символами не співпадатимусть з новим рядком, тим не менш.

Негативний список ([^...]), у якому не вказано знаку нового рядка, не збігатиметься автоматично з новим рядком.

Оператори початку рядків (^) співпадатимуть з порожнім ланцюжком одразу після знаку нового рядка незалежно від того, чи eflags, прапор виконання regexec, містить REG_NOTBOL.

Оператор кінця рядка ($) збігатиметься з порожнім ланцюжком перед перед самим символом нового рядка, незалежно від того, чи eflags містить REG_NOTEOL.

СПІВПАДАННЯ З РЕГУЛЯРНИМИ ВИРАЗАМИ POSIX

regexec використовується для порівнювання ланцюжків з нульовим закінченням із попередньо-обробленим буферним шаблоном preg. Змінні nmatch та pmatch використовуються щоб отримати інформацію про місцезнаходження будь-яких збігів. eflags може бути порозрядним АБО одного або обох REG_NOTBOL і REG_NOTEOL. Ці значення визначають поведінку процесу порівнювання, як описано нижче.

REG_NOTBOL : Оператор початку нового рядка завжди зазнає навдачі (але дивіться, описаний вище, прапор обробки REG_NEWLІNE). Цей прапор може використовуватись, коли у regexec обробляються окремі частини ланцюжків, і початок таких частин, у даному випадку, не повинен розглядатись як початок нового рядка.

REG_NOTEOL : Не береться до уваги оператор кінця рядка (але дивіться, описаний вище, прапор обробки REG_NEWLІNE).

ПОЗИЦІЯ БАЙТІВ

Хіба REG_NOSUB було встановлено для обробки буферного шаблону, завжди є можливість отримати інформацію про положення внутрішньо-ланцюжкових збігів. pmatch повинно бути визначена так, щоб мати, принаймні, nmatch елементів. Вони заповнюються regexec-адресами внутрішньо-ланцюжкових збігів. Будь-які невикористані елементи структури будуть містити значення -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_sіze. Буде повернуто розмір errbuf, необхідного для утримування рядка з нульовим закінченням, містячого повідомленням про помилку. Якщо errbuf і errbuf_sіze не є нульовими, то errbuf заповнюється першими errbuf_sіze - 1 символами повідомлення про помилку і завершуються нулем.

ВИВІЛЬНЕННЯ БУФЕРУ ШАБЛОНУ ВІДПОВІДНО З POSIX

Після надання regfree попередньо обробленого буферного шаблону, preg звільнить пам'ять, відведену цьому шаблонові під час процесу компіляції regcomp.

ПОВЕРНЕНЕ ЗНАЧЕННЯ

regcomp повертає нуль при успішній компіляції або код помилки у випадку невдачі.

regexec повертає нуль у випадку співпадань або REG_NOMATCH, якщо співпадань не відбулося.

КОДИ ПОМИЛОК

regcomp може повертати наступні помилки:

REG_BADRPT : Невірне використання операторів повторення, наприклад '*' як перший символ.

REG_BADBR : Невірне використання операторів зворотних посилань.

REG_EBRACE : Відсутня пара фігурної дужки.

REG_EBRACK : Відсутня пара квадратної дужки (оператори списку).

REG_ERANGE : Невірне використання операторів інтервалу: у цьому випадку кінець інтервалу з'являється до його початку.

REG_ECTYPE : Невідома назва класу символів.

REG_ECOLLATE : Невірний елемент сортування, помилка сортування елементів.

REG_EPAREN : Відсутня пара круглої дужки (оператор групування).

REG_ESUBREG : Помилкове зворотнє посилання на частину виразу.

REG_EEND : Невизначена помилка. (Не описана у POSIX.2.)

REG_EESCAPE : Кінцевий зворотній слеш.

REG_BADPAT : Невірне використання операторів шаблону, таких як оператори групи або списку.

REG_ESІZE : Компільований регулярний вираз вимагає буферний шаблон розміром більшим за 64 Кб. (Не описано у POSIX.2.)

REG_ESPACE : Виснаження пам'яті функціями регулярних виразів.

ВІДПОВІДНІСТЬ СТАНДАРТАМ

POSIX.2

ДИВІТЬСЯ ТАКОЖ

?regex(7), GNU regex manual


Переклав українською Віталій Цибуляк vi@uatech.atspace.com