See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
PCRE — Википедия

PCRE

Материал из Википедии — свободной энциклопедии

PCRE (Perl Compatible Regular Expressions) — библиотека, реализующая работу регулярных выражений в стиле Perl (с некоторыми отличиями). Синтаксис регулярных выражений PCRE значительно более мощный и гибкий, чем стандартных регулярных выражений Posix. В PHP является частью ядра. Автор библиотеки — Филипп Хейзел (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.h>
# include <pcre.h>
 
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;
}

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

  • www.pcre.org(англ.) — Домашняя страница PCRE.
  • PCRE-7.1.chm(англ.) документация PCRE в формате chm.
  • webcode.ru/re/pcre — Регулярные выражения в C++. Использование библиотеки 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)


На других языках


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -