PCRE

PCRE
PCRE
Тип

Библиотека регулярных выражений

Написана на

C

Операционная система

кроссплатформенная

Последняя версия

8.32 (30 ноября 2012)

Лицензия

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. Следующие три аргумента — анализируемая строка, её длина и смещение, начиная с которого будет обрабатываться строка. Затем — параметр, указывающий опции (их подробное описание см. в документации).

В последних двух аргументах нужно указать ссылку на зарезервированный массив целых чисел и его длину. В этот массив заносятся пары индексов, указывающих на начало и конец совпадений. Первые два элемента массива описывают положение всего совпавшего выражения. Остальные пары — положение подстрок, которые совпали с выражениями в круглых скобках в шаблоне (аналоги переменных вида $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.

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 освобождает переменную, хранящую 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;
}

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Поможем написать реферат

Полезное


Смотреть что такое "PCRE" в других словарях:

  • PCRE — Perl Compatible Regular Expressions (kurz PCRE, deutsch Perl Kompatible Reguläre Ausdrücke) ist eine Programmbibliothek zur Auswertung von Regulären Ausdrücken. Der Name bezieht sich darauf, dass die Syntax der Ausdrücke der Programmiersprache… …   Deutsch Wikipedia

  • PCRE — Perl Compatible Regular Expression (PCRE) désigne un type d expression rationnelle compatible avec celles du langage Perl. PCRE désigne aussi la bibliothèque qui implante ce type d expressions rationnelles. Les PCRE sont beaucoup plus riches que… …   Wikipédia en Français

  • Pcre — …   Википедия

  • PCRE — Perl Compatible Regular Expression (Computing » Software) …   Abbreviations dictionary

  • PCRE — ● ►en sg. f. ►PERL Perl Compatible Regular Expression. expression rationnelle compatible avec le langage Perl …   Dictionnaire d'informatique francophone

  • Perl Compatible Regular Expressions — Original author(s) Philip Hazel Stable release 8.20 / 2011 10 21; 25 days ago (2011 10 21) Written in C …   Wikipedia

  • Comparison of regular expression engines — Contents 1 Libraries 2 Languages 3 Language features 3.1 Part 1 3.2 Part 2 …   Wikipedia

  • Perl Compatible Regular Expressions — (PCRE) Maintainer Philip Hazel Aktuelle Version 8.20 (21. Oktober 2011) Betriebssystem unixoide, Windows Programmier­sprache …   Deutsch Wikipedia

  • Expreg — Expression rationnelle Pour les articles homonymes, voir régulier et rationnel. Une expression rationnelle ou expression régulière[1] est en informatique une chaîne de caractères que l’on appelle parfois un motif et qui décrit un ensemble de… …   Wikipédia en Français

  • Expression Rationnelle — Pour les articles homonymes, voir régulier et rationnel. Une expression rationnelle ou expression régulière[1] est en informatique une chaîne de caractères que l’on appelle parfois un motif et qui décrit un ensemble de chaînes de caractères… …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»