PCRE

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску
PCRE
Тип Библиотека регулярных выражений
Написана на C
ОС кроссплатформенная
Версия 7.9 (11 апреля 2009)
Лицензия BSD
Сайт pcre.org

PCRE (Perl Compatible Regular Expressions) — библиотека, реализующая работу регулярных выражений в стиле Perl (с некоторыми отличиями). Синтаксис регулярных выражений PCRE значительно более мощный и гибкий, чем стандартных регулярных выражений POSIX. В PHP является частью ядра. Автор библиотеки — Филип Хейзел (Philip Hazel). Библиотека написана на Си и распространяется под свободной лицензией BSD.

Функции библиотеки

Базовые функции

<source lang=c> pcre *pcre_compile(const char *pattern, int options,

         const char **errptr, int *erroffset, 
         const unsigned char *tableptr);</source>

Функция pcre_compile компилирует регулярное выражение во внутреннее представление библиотеки. Первый аргумент — ссылка на содержащую регулярное выражение строку. Во втором можно указать различные атрибуты (соответствующие опциям /igms… в Perl). Последний аргумент — ссылка на таблицу кодировки, созданную pcre_maketables. Если при компиляции шаблона произошла ошибка, возвращает NULL. <source lang=c>int pcre_exec(const pcre *code, const pcre_extra *extra,

         const char *subject, int length, int startoffset, int options, 
         int *ovector, int ovecsize);</source>

Функцию pcre_exec используют для поиска совпадений. В первом аргументе передают значение, возвращённое pcre_compile. Следующие три аргумента — анализируемая строка, её длина и смещение, начиная с которого будет обрабатываться строка. Затем — параметр, указывающий опции (их подробное описание см. в документации).

В последних двух аргументах нужно указать ссылку на зарезервированный массив целых чисел и его длину. В этот массив заносятся пары индексов, указывающих на начало и конец совпадений. Первые два элемента массива описывают положение всего совпавшего выражения. Остальные пары — положение подстрок, которые совпали с выражениями в круглых скобках в шаблоне (аналоги переменных вида $1 в Perl).

<source lang=c> pcre_extra *pcre_study(const pcre *code, int options, const char **errptr); </source> Функция ускоряет работу программы, выполняющей множество сопоставлений с одним и тем-же шаблоном. Создаёт переменную, которая хранит дополнительные сведения о шаблоне, ускоряющие его обработку функцией pcre_exec <source lang=c> const unsigned char *pcre_maketables(void); </source> Cоздает таблицу символов для использования её функцией pcre_compile

Извлечение подстрок

<source lang=c> int pcre_copy_substring(const char *subject, int *ovector, int stringcount,

       int stringnumber, char *buffer, int buffersize);

</source> <source lang=c> int pcre_get_substring(const char *subject, int *ovector,

       int stringcount, int stringnumber, const char **stringptr);

</source> Получает из строки одну из найденных подстрок. Для этого указывается номер найденной подстроки. Эти функции отличаются друг от друга тем, что pcre_copy_substring записывает результат в буфер, которому уже выделена память, а pcre_get_substring выделяет память для буфера и записывает в него результат.

Первые четыре параметра у указанных функций одинаковые: первый — строка, в которой производился поиск, второй — массив, созданный функцией pcre_exec, третий — значение, возвращённое функцией pcre_exec, то есть количество найденных подстрок, четвёртый — номер нужной подстроки.

Функции возвращают длину подстроки в случае успеха, в противном случае — отрицательное значение — код ошибки <source lang=c> int pcre_get_substring_list(const char *subject, int *ovector,

       int stringcount, const char ***listptr);

</source> Получает из строки все найденные подстроки. <source lang=c>void pcre_free_substring(const char *stringptr);</source> <source lang=c>void pcre_free_substring_list(const char **stringptr);</source> Освобождают память выделенную, соответственно, pcre_get_substring и pcre_get_substring_list.

POSIX-совместимые

В PCRE также реализованы функции работы с регулярными выражениями, совместимые со стандартом POSIX. Эти функции нельзя использовать для обработки строк в кодировке, отличающейся от базовой ASCII: <source lang=c>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);</source> Функция regerror преобразует код ошибки, возвращаемый функциями regcomp и regexec, в сообщение об ошибке. Первый параметр — код ошибки. Второй — скомпилированный шаблон. Третий — строка, в которую будет записано сообщение. Четвёртый — её максимальная длина.

Функция regfree освобождает переменную, хранящую cкомпилированный шаблон, которая передаётся как параметр. Применяется, когда нужно использовать одну и ту же переменную для нескольких операциях поиска.

Пример использования

Это пример простейшей программы на С++. Регулярное выражение и строка заданы в исходном тексте. <source lang=cpp>

  1. include <iostream.h>
  2. 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, 4, 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";
           }
        }
     }
  }
  return 0;

} </source>

Ссылки

  • pcre.org(англ.) — Домашняя страница PCRE.
  • pcre.org/pcre.txt(англ.) — Документация PCRE.
  • dh.opennet.ru/pcre.html — Адлан Ерижоков «PCRE»
  • www.pcre.ru — Универсальная энциклопедия регулярных выражений стандарта PCRE
  • regexp.ru — /Регулярные выражения/ (проект Андрея Шитова)
  • www.shtogrin.com/library/web/pcre — Perl-совместимые регулярные выражения (PCRE)
  • http://myregexp.com/applet.html(англ.) — Online редактор регулярных выражений с полной подсветкой синтаксиса (PCRE) (java-applet)


de:Perl Compatible Regular Expressions en:Perl Compatible Regular Expressions fr:PCRE ja:Perl Compatible Regular Expressions pl:PCRE pt:PCRE

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....