Svoboda | Graniru | BBC Russia | Golosameriki | Facebook

Для установки нажмите кнопочку Установить расширение. И это всё.

Исходный код расширения WIKI 2 регулярно проверяется специалистами Mozilla Foundation, Google и Apple. Вы также можете это сделать в любой момент.

4,5
Келли Слэйтон
Мои поздравления с отличным проектом... что за великолепная идея!
Александр Григорьевский
Я использую WIKI 2 каждый день
и почти забыл как выглядит оригинальная Википедия.
Статистика
На русском, статей
Улучшено за 24 ч.
Добавлено за 24 ч.
Что мы делаем. Каждая страница проходит через несколько сотен совершенствующих техник. Совершенно та же Википедия. Только лучше.
.
Лео
Ньютон
Яркие
Мягкие

Из Википедии — свободной энциклопедии

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 года.

Ссылки

Эта страница в последний раз была отредактирована 13 мая 2024 в 07:51.
Как только страница обновилась в Википедии она обновляется в Вики 2.
Обычно почти сразу, изредка в течении часа.
Основа этой страницы находится в Википедии. Текст доступен по лицензии CC BY-SA 3.0 Unported License. Нетекстовые медиаданные доступны под собственными лицензиями. Wikipedia® — зарегистрированный товарный знак организации Wikimedia Foundation, Inc. WIKI 2 является независимой компанией и не аффилирована с Фондом Викимедиа (Wikimedia Foundation).