Scroll to navigation

regcomp(3) 2007-10-27-16:31 regcomp(3)

НАЗВА

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 може бути порозрядним АБО одного або декількох з наступного:

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

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

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

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

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

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

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

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

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


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

Не береться до уваги оператор кінця рядка (але дивіться, описаний вище, прапор обробки 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 може повертати наступні помилки:


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

POSIX.2

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

regex(7), GNU regex manual

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

2007-10-27-16:31 © 2005-2007 DLOU, GNU FDL