PCRE

Из Википедии, бесплатной энциклопедии

PCRE
Тип Библиотека регулярных выражений
Разработчик Philip Hazel[вд]
Написана на C
Операционная система кроссплатформенная
Последняя версия
Репозиторий github.com/PCRE2Project/…
Лицензия BSD
Сайт 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]

Пример использования[править | править код]

Это пример простейшей программы на C++. Регулярное выражение и строка заданы в исходном тексте (компилировать с ключом -lpcre).

# include <iostream> # include <string.h> # 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) { // в случае ошибки компиляции       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; } 

Примечания[править | править код]

  1. Release PCRE2-10.43
  2. 1 2 PCRE(3) Library Functions Manual (англ.). Дата обращения: 29 октября 2013. Архивировано 28 ноября 2017 года.
  3. Jiong Wang (Tilera Corporation). Add JIT support for the 64 bit TileGX architecture. (англ.) (14 октября 2013). — Патч добавляющий JIT транслятор для архитектуры TileGX в библиотеку PCRE (более 12000 строк). Архивировано из оригинала 29 октября 2013 года.

Ссылки[править | править код]