PCRE
Тип | Бібліотека регулярних виразів |
---|---|
Розробник | Philip Hazeld |
Стабільний випуск | 8.41 (2017-07-05) |
Версії | 10.42 (12 грудня 2022)[1] |
Операційна система | кросплатформна |
Мова програмування | C |
Ліцензія | BSD |
Онлайн-документація |
pcre2project.github.io/pcre2/doc/html/index.html(англ.) pcre.org/current/doc/html/index.html(англ.) |
Репозиторій | github.com/PCRE2Project/pcre2 |
Вебсайт | pcre.org |
PCRE (Perl Compatible Regular Expressions) — бібліотека, що реалізує роботу регулярних виразів у стилі Perl (з деякими відмінностями). Синтаксис регулярних виразів PCRE значно потужніший і гнучкіший, ніж стандартних регулярних виразів POSIX.
У тому чи іншому вигляді доступна для дуже багатьох мов програмування. Зокрема, в PHP модуль PCRE включений в ядро.
Автор бібліотеки — Філіп Хейзел (Philip Hazel). Бібліотека написана на Сі й розповсюджується під вільною ліцензією BSD.
Функції бібліотеки[ред. | ред. код]
Базові функції[ред. | ред. код]
pcre *pcre_compile(const char *pattern, int options,
const char **errptr, int *erroffset,
const unsigned char *tableptr);
Функція pcre_compile компілює регулярний вираз у внутрішнє представлення бібліотеки. Перший аргумент — посилання на рядок, що містить регулярний вираз. У другому можна вказати різні атрибути (які відповідають опціям /igms… в Perl). Останній аргумент — посилання на таблицю кодування, створену pcre_maketables. Якщо під час компіляції шаблону сталася помилка, повертає NULL.
int pcre_exec(const pcre *code, const pcre_extra *extra,
const char *subject, int length, int startoffset, int options,
int *ovector, int ovecsize);
Функцію pcre_exec використовують для пошуку збігів. У першому аргументі передають значення, повернене pcre_compile. У другому — додаткові відомості, повернуті функцією pcre_study. Наступні три аргументи — аналізований рядок, його довжина та зміщення, починаючи з якого буде оброблятися рядок. Потім — параметр, який вказує опції (їхній докладний опис див. у документації).
В останніх двох аргументах потрібно вказати посилання на зарезервований масив цілих чисел і його довжину. У цей масив заносяться пари індексів, що вказують на початок і кінець збігів. Перші два елементи масиву описують положення всього виразу, що збігся. Інші пари — положення підрядків, які збіглися з виразами в круглих дужках у шаблоні (аналоги змінних виду $1 у Perl).
pcre_extra *pcre_study(const pcre *code, int options, const char **errptr);
Функція прискорює роботу програми, що виконує множину зіставлень з одним і тим самим шаблоном. Створює змінну, яка зберігає додаткові відомості про шаблон, які прискорюють його обробку функцією pcre_exec
const unsigned char *pcre_maketables(void);
Створює таблицю символів для використання її функцією pcre_compile
Добування підрядків[ред. | ред. код]
int pcre_copy_substring(const char *subject, int *ovector, int stringcount,
int stringnumber, char *buffer, int buffersize);
int pcre_get_substring(const char *subject, int *ovector,
int stringcount, int stringnumber, const char **stringptr);
Отримує з рядка один із знайдених підрядків. Для цього вказується номер знайденого підрядка. Ці функції відрізняються одна від одної тим, що pcre_copy_substring записує результат у буфер, якому вже виділена пам'ять, а pcre_get_substring виділяє пам'ять для буфера й записує в нього результат.
Перші чотири параметри в зазначених функціях однакові: перший — рядок, в якому проводився пошук, другий — масив, створений функцією pcre_exec, третій — значення, повернуте функцією pcre_exec, тобто кількість знайдених підрядків, четвертий — номер потрібного підрядка.
Функції повертають довжину підрядка в разі успіху, в іншому випадку — від'ємне значення — код помилки
int pcre_get_substring_list(const char *subject, int *ovector,
int stringcount, const char ***listptr);
Отримує з рядка всі знайдені підрядки.
void pcre_free_substring(const char *stringptr);
void pcre_free_substring_list(const char **stringptr);
Звільняють пам'ять, виділену, відповідно, pcre_get_substring і pcre_get_substring_list.
POSIX-сумісні[ред. | ред. код]
У PCRE також реалізовані функції роботи з регулярними виразами, сумісні зі стандартом POSIX. Ці функції можна використовувати для обробки рядків у кодуванні, що відрізняється від базової ASCII:
int regcomp(regex_t *preg, const char *pattern, int cflags);
int regexec(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);
Функція regerror перетворює код помилки, що повертається функціями regcomp і regexec, у повідомлення про помилку. Перший параметр — код помилки. Другий — скомпільований шаблон. Третій — рядок, в який буде записано повідомлення. Четвертий — його довжина.
Функція regfree звільняє змінну, що зберігає скомпільований шаблон, яка передається як параметр. Застосовується, коли потрібно використовувати одну й ту саму змінну для кількох операцій пошуку.
Компіляція Just-in-time[ред. | ред. код]
Ця опціональна можливість доступна у версії 8.20 і вище, якщо вона була дозволена при складанні бібліотеки PCRE. Найбільший приріст продуктивності можливий, наприклад, коли викликаюча програма повторно використовує раніше відтрансльовані регулярні вирази. Підтримка JIT була написана Золтаном Херцегом (Zoltan Herczeg)[2] і не призначена для інтерфейсів POSIX та C++. Вбудований транслятор працює на таких архітектурах:[2]
- ARM v5, v7 і Thumb2
- Intel x86 32-біти й 64-біти
- MIPS 32-біти
- Power PC 32-біти й 64-біти
- SPARC 32-біти (експериментально)
- TileGX (експериментально, починаючи з 8.34)[3]
Приклад використання[ред. | ред. код]
Це приклад найпростішої програми на С++. Регулярний вираз і рядок задані у вихідному тексті (Компілювати з ключем -lpcre).
# include <iostream>
# include <string.h>
# include <pcre.h>
using namespace std;
int main() {
char pattern[] = "[es]"; // шаблон (регулярний вираз)
char str[] = "test"; // рядок, що розбирається
// створення таблиці перекодування для локалі uk
const unsigned char *tables = NULL;
setlocale (LC_CTYPE, (const char *) "uk.");
tables = pcre_maketables();
// компілювання регулярного виразу у внутрішнє представлення
pcre *re;
int options = 0;
const char *error;
int erroffset;
re = pcre_compile ((char *) pattern, options, &error, &erroffset, tables);
if (!re) { // у разі помилки компіляції
cerr << "Failed at offset " << erroffset << ":" << error << "\n";
} else {
int count = 0;
int ovector[30];
count = pcre_exec (re, NULL, (char *) str, strlen(str), 0, 0, ovector, 30);
// зіставляння із взірцем
if (!count) { // якщо немає збігів
cout << "No match\n";
} else {
//виведення пар {початок, кінець} збігу
for (int c = 0; c < 2 * count; c += 2) {
if (ovector[c] < 0) { // або <unset> для підвиразів, що не збіглися
cout << "<unset>\n";
} else{
cout << ovector[c] << ovector[c + 1] << "\n";
}
}
}
}
// звільняємо дані, під які виділялася пам'ять
pcre_free((void *) re);
pcre_free((void *) tables);
return 0;
}
Примітки[ред. | ред. код]
- ↑ Release 10.42 — 2022.
- ↑ а б PCRE(3) Library Functions Manual (англ.). Архів оригіналу за 28 листопада 2017. Процитовано 3 грудня 2017.
- ↑ Jiong Wang (Tilera Corporation) (14 жовтня 2013). Add JIT support for the 64 bit TileGX architecture. (англ.). Архів оригіналу за 29 жовтня 2013. Процитовано 3 грудня 2017. — Патч, що додає JIT транслятор для архітектури TileGX у бібліотеку PCRE (понад 12000 рядків)
Посилання[ред. | ред. код]
- pcre.org [Архівовано 16 липня 2018 у Wayback Machine.] — Домашня сторінка PCRE. (англ.)
- pcre.org/pcre.txt [Архівовано 28 листопада 2017 у Wayback Machine.] — Документація PCRE. (англ.)
- Вікі-документація з PCRE (деякі сторінки не перекладені) [Архівовано 4 грудня 2017 у Wayback Machine.] (рос.)
- Універсальна енциклопедія регулярних виразів стандарту PCRE [Архівовано 2 квітня 2022 у Wayback Machine.] (рос.)
- www.shtogrin.com/library/web/pcre [Архівовано 2 грудня 2017 у Wayback Machine.] — Perl-сумісні регулярні вирази (PCRE) (рос.)
- http://myregexp.com/applet.html [Архівовано 12 грудня 2017 у Wayback Machine.] — Online редактор регулярних виразів із повним підсвічуванням синтаксису (PCRE) (java-applet) (англ.)