| 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(constchar*pattern,intoptions, constchar**errptr,int*erroffset, constunsignedchar*tableptr);
Функция pcre_compile компилирует регулярное выражение во внутреннее представление библиотеки. Первый аргумент — ссылка на содержащую регулярное выражение строку. Во втором можно указать различные атрибуты (соответствующие опциям /igms… в Perl). Последний аргумент — ссылка на таблицу кодировки, созданную pcre_maketables. Если при компиляции шаблона произошла ошибка, возвращает NULL.
intpcre_exec(constpcre*code,constpcre_extra*extra, constchar*subject,intlength,intstartoffset,intoptions, int*ovector,intovecsize);
Функцию pcre_exec используют для поиска совпадений. В первом аргументе передают значение, возвращённое pcre_compile. Во втором — дополнительные сведения, возвращённые функцией pcre_study. Следующие три аргумента — анализируемая строка, её длина и смещение, начиная с которого будет обрабатываться строка. Затем — параметр, указывающий опции (их подробное описание см. в документации).
В последних двух аргументах нужно указать ссылку на зарезервированный массив целых чисел и его длину. В этот массив заносятся пары индексов, указывающих на начало и конец совпадений. Первые два элемента массива описывают положение всего совпавшего выражения. Остальные пары — положение подстрок, которые совпали с выражениями в круглых скобках в шаблоне (аналоги переменных вида $1 в Perl).
pcre_extra*pcre_study(constpcre*code,intoptions,constchar**errptr);
Функция ускоряет работу программы, выполняющей множество сопоставлений с одним и тем же шаблоном. Создаёт переменную, которая хранит дополнительные сведения о шаблоне, ускоряющие его обработку функцией pcre_exec
constunsignedchar*pcre_maketables(void);
Создает таблицу символов для использования её функцией pcre_compile
Извлечение подстрок
[править | править код]intpcre_copy_substring(constchar*subject,int*ovector,intstringcount, intstringnumber,char*buffer,intbuffersize);
intpcre_get_substring(constchar*subject,int*ovector, intstringcount,intstringnumber,constchar**stringptr);
Получает из строки одну из найденных подстрок. Для этого указывается номер найденной подстроки. Эти функции отличаются друг от друга тем, что pcre_copy_substring записывает результат в буфер, которому уже выделена память, а pcre_get_substring выделяет память для буфера и записывает в него результат.
Первые четыре параметра у указанных функций одинаковые: первый — строка, в которой производился поиск, второй — массив, созданный функцией pcre_exec, третий — значение, возвращённое функцией pcre_exec, то есть количество найденных подстрок, четвёртый — номер нужной подстроки.
Функции возвращают длину подстроки в случае успеха, в противном случае — отрицательное значение — код ошибки
intpcre_get_substring_list(constchar*subject,int*ovector, intstringcount,constchar***listptr);
Получает из строки все найденные подстроки.
voidpcre_free_substring(constchar*stringptr);
voidpcre_free_substring_list(constchar**stringptr);
Освобождают память, выделенную, соответственно, pcre_get_substring и pcre_get_substring_list.
POSIX-совместимые
[править | править код]В PCRE также реализованы функции работы с регулярными выражениями, совместимые со стандартом POSIX. Эти функции нельзя использовать для обработки строк в кодировке, отличающейся от базовой ASCII:
intregcomp(regex_t*preg,constchar*pattern,intcflags); intregexec(regex_t*preg,constchar*string,size_tnmatch,regmatch_tpmatch[],inteflags); size_tregerror(interrcode,constregex_t*preg,char*errbuf,size_terrbuf_size); voidregfree(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> usingnamespacestd; intmain(){ charpattern[]="[es]";// шаблон (регулярное выражение) charstr[]="test";// разбираемая строка // создание таблицы перекодировки для локали ru constunsignedchar*tables=NULL; setlocale(LC_CTYPE,(constchar*)"ru."); tables=pcre_maketables(); // компилирование регулярного выражения во внутреннее представление pcre*re; intoptions=0; constchar*error; interroffset; re=pcre_compile((char*)pattern,options,&error,&erroffset,NULL); if(!re){// в случае ошибки компиляции cerr<<"Failed at offset "<<erroffset<<":"<<error<<"\n"; }else{ intcount=0; intovector[30]; count=pcre_exec(re,NULL,(char*)str,strlen(str),0,0,ovector,30); // выполнение сопоставления с образцом if(!count){// если нет совпадений cout<<"No match\n"; }else{ //вывод пар {начало, конец} совпадения for(intc=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); return0; }
Примечания
[править | править код]- ↑ Release 10.47 — 2025.
- ↑ 1 2 PCRE(3) Library Functions Manual (англ.). Дата обращения: 29 октября 2013. Архивировано 28 ноября 2017 года.
- ↑ Jiong Wang (Tilera Corporation). Add JIT support for the 64 bit TileGX architecture. (англ.) (14 октября 2013). — Патч добавляющий JIT транслятор для архитектуры TileGX в библиотеку PCRE (более 12000 строк). Архивировано из оригинала 29 октября 2013 года.
Ссылки
[править | править код]- pcre.org (англ.) — Домашняя страница PCRE.
- pcre.org/pcre.txt (англ.) — Документация PCRE.
- Русская вики-документация по PCRE (некоторые страницы не переведены)
- Универсальная энциклопедия регулярных выражений стандарта PCRE
- www.shtogrin.com/library/web/pcre — Perl-совместимые регулярные выражения (PCRE)
- http://myregexp.com/applet.html (англ.) — Online редактор регулярных выражений с полной подсветкой синтаксиса (PCRE) (java-applet)
- Страницы, использующие устаревший тег source
- Википедия:Статьи со ссылками на элементы Викиданных без русской подписи
- Википедия:Статьи с источниками из Викиданных
- Википедия:Статьи без изображений (тип: свободное программное обеспечение)
- Википедия:Статьи без изображений (тип: библиотека функций)
- ПРО:ИТ:Статьи по алфавиту
- ПРО:ИТ:Последняя правка: в прошлом году
- Статьи с примерами кода C++
