28-08-2023
Тип |
Библиотека регулярных выражений |
---|---|
Написана на | |
Операционная система | |
Последняя версия | |
Лицензия | |
Сайт |
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. Следующие три аргумента — анализируемая строка, её длина и смещение, начиная с которого будет обрабатываться строка. Затем — параметр, указывающий опции (их подробное описание см. в документации).
В последних двух аргументах нужно указать ссылку на зарезервированный массив целых чисел и его длину. В этот массив заносятся пары индексов, указывающих на начало и конец совпадений. Первые два элемента массива описывают положение всего совпавшего выражения. Остальные пары — положение подстрок, которые совпали с выражениями в круглых скобках в шаблоне (аналоги переменных вида $1 в Perl).
pcre_extra *pcre_study(const pcre *code, int options, const char **errptr);
Функция ускоряет работу программы, выполняющей множество сопоставлений с одним и тем же шаблоном. Создаёт переменную, которая хранит дополнительные сведения о шаблоне, ускоряющие его обработку функцией pcre_exec
const unsigned char *pcre_maketables(void);
Cоздает таблицу символов для использования её функцией 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.
В 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 освобождает переменную, хранящую cкомпилированный шаблон, которая передаётся как параметр. Применяется, когда нужно использовать одну и ту же переменную для нескольких операциях поиска.
Это пример простейшей программы на С++. Регулярное выражение и строка заданы в исходном тексте.
# include <iostream> # include <pcre.h> using namespace std; int main(){ char pattern[] = "[es]"; // шаблон (регулярное выражение) char str[] = "test"; // разбираемая строка // создание таблицы перекодировки для локали ru const unsigned char *tables = NULL; setlocale (LC_CTYPE, (const char *) "ru."); tables = pcre_maketables(); // компилирование регулярного выражения во внутреннее представление pcre *re; int options = 0; const char *error; int erroffset; re = pcre_compile ((char *) pattern, options, &error, &erroffset, NULL); if (!re){ // в случае ошибки компиляции cout << "Failed\n"; } else{ int count = 0; int ovector[30]; count = pcre_exec (re, NULL, (char *) str, strlen(str), 0, NULL, 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"; } } } } return 0; }
PCRE.