НАЗВА
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