Perl-совместимые регулярные выражения

редактировать
Программная библиотека для интерпретации регулярных выражений
Perl-совместимые регулярные выражения
Автор (ы) Philip Hazel
Стабильная версия PCRE 8.44 и PCRE2 10.35 / 9 мая 2020 г.; 5 месяцев назад (2020-05-09)
Репозиторий Измените это в Викиданных
Написано наC
Операционная система Кросс-платформенная
Тип Сопоставление с образцом библиотека
Лицензия BSD
Веб-сайтwww.pcre.org

Perl-совместимые регулярные выражения (PCRE ) - это библиотека, написанная на C, которая реализует механизм регулярных выражений, вдохновленный возможностями языка программирования Perl. Филип Хейзел начал писать PCRE летом 1997 года. Синтаксис PCRE намного более мощный и гибкий, чем любой из вариантов регулярного выражения POSIX (BRE, ERE) и чем у многих других библиотек регулярных выражений.

Хотя изначально PCRE стремилась к эквивалентности функций с Perl, эти две реализации не являются полностью эквивалентными. На этапе PCRE 7.x и Perl 5.9.x эти два проекта координировали разработку, при этом функции переносились между ними в обоих направлениях.

В 2015 году был выпущен форк PCRE с переработанным программным интерфейсом (API). В исходном программном обеспечении, которое теперь называется PCRE1 (серия 8.xx), были исправлены ошибки, но дальнейшего развития не было. Сейчас (2020 г.) он считается устаревшим, а текущий выпуск 8.44, вероятно, будет последним. Новый код PCRE2 (серия 10.xx) имеет ряд расширений и улучшений кодирования, и именно здесь происходит разработка.

Ряд известных программ с открытым исходным кодом, таких как HTTP-серверы Apache и Nginx, а также PHP и R языки сценариев, включают библиотеку PCRE; проприетарное программное обеспечение может делать то же самое, поскольку библиотека имеет лицензию BSD. Начиная с Perl 5.10, PCRE также доступен в качестве замены обработчика регулярных выражений Perl по умолчанию через модуль re :: engine :: PCRE.

Библиотека может быть создана в Unix, Windows и некоторых других средах. PCRE2 распространяется с оболочкой POSIX C, несколькими тестовыми программами и служебной программой pcre2grep, встроенной в тандеме с библиотекой.

.

.

Содержание

  • 1 Возможности
    • 1.1 Своевременная поддержка компилятора
    • 1.2 Гибкое управление памятью
    • 1.3 Согласованные правила экранирования
    • 1.4 Расширенные классы символов
    • 1.5 Минимальное соответствие (также известное как " ungreedy ")
    • 1.6 Свойства символов Юникода
    • 1.7 Многострочное соответствие
    • 1.8 Параметры перехода на новую строку
    • 1.9 Параметры обратной косой черты
    • 1.10 Начало параметров шаблона
    • 1.11 Обратные ссылки
    • 1.12 Именованные подшаблоны
    • 1.13 Подпрограммы
    • 1.14 Атомарная группировка
    • 1.15 Утверждения упреждающего и обратного просмотра
    • 1.16 Управляющие последовательности для утверждений нулевой ширины
    • 1.17 Комментарии
    • 1.18 Рекурсивные паттерны
    • 1.19 Общие выноски
  • 2 Отличия от Perl
  • 3 Примечания и ссылки
    • 3.1 Примечания
    • 3.2 Ссылки
  • 4 См. Также
    • 4.1 Внешние ссылки
      • 4.1.1 Вычислительная служба Кембриджского университета ( CSX)

Возможности

Оперативный компилятор поддержка

Эта дополнительная функция доступна, если включена при сборке библиотеки PCRE2. Возможны большие преимущества в производительности, когда (например) вызывающая программа использует функцию с совместимыми шаблонами, которые выполняются повторно. Поддержка JIT-компилятора была написана Золтаном Герцегом и не рассматривается в оболочке POSIX.

.

Гибкое управление памятью

Использование системного стека для отслеживания с возвратом может быть проблематичным в PCRE1, поэтому эта функция реализации была изменена в PCRE2. Теперь для этой цели используется куча, и ее общий объем может быть ограничен. Проблема переполнения стека, которая регулярно возникала в PCRE1, больше не является проблемой для PCRE2 из выпуска 10.30 (2017).

.

Согласованные правила экранирования

Как и Perl, в PCRE2 есть последовательные правила экранирования: любой не буквенно-цифровой символ может быть экранирован для обозначения его буквального значения путем добавления префикса \(обратная косая черта) перед персонаж. Любой буквенно-цифровой символ, которому предшествует обратная косая черта, обычно придает ему особое значение. В случае, если последовательность не была определена как особая, возникает ошибка. Это отличается от Perl, который выдает ошибку только в том случае, если он находится в режиме предупреждения (PCRE2 не имеет режима предупреждения). В регулярных выражениях POSIX иногда обратная косая черта экранировалась не-буквенно-цифровыми символами (например, \.), а иногда они вводили специальную функцию (например, \ (\)).

.

Расширенные классы символов

Однобуквенные классы символов поддерживаются в дополнение к более длинным именам POSIX. Например, \ dсоответствует любой цифре точно так же, как [[: digit:]]в регулярных выражениях POSIX.

.

Минимальное совпадение (также известное как «ungreedy»)

A ?может быть помещено после любого квантификатора повторения, чтобы указать, что следует использовать самое короткое совпадение. По умолчанию сначала выполняется попытка поиска самого длинного совпадения и возврат к более коротким совпадениям: например, a. *? Bсоответствует "ab" в "ababab", где a. * Bсоответствует всей строке.

.

Свойства символов Юникода

Юникод определяет несколько свойств для каждого символа. Шаблоны в PCRE2 могут соответствовать этим свойствам: например, \ p {Ps}. *? \ P {Pe}будет соответствовать строке, начинающейся с любой «открывающей пунктуации» и заканчивающейся любой «закрытой пунктуацией», например, [abc]. Сопоставление определенных "нормальных" метасимволов может управляться свойствами Unicode, если установлен параметр компиляции PCRE2_UCP. Опцию можно установить для шаблона, включив (* UCP)в начало шаблона. Параметр изменяет поведение следующих метасимволов: \B, \b, \D, \d, \S, \s, \W, \wи некоторых классов символов POSIX. Например, набор символов, соответствующих \ w(символы слова), расширяется и включает буквы и буквы с диакритическими знаками, как определено в свойствах Unicode. Такое сопоставление происходит медленнее, чем обычная (только ASCII ) альтернатива без UCP. Обратите внимание, что опция UCP требует, чтобы библиотека была построена с поддержкой Unicode (это значение по умолчанию для PCRE2). Самые ранние версии PCRE1 поддерживали только код ASCII. Позже была добавлена ​​поддержка UTF-8. Поддержка UTF-16 была добавлена ​​в версии 8.30, а поддержка UTF-32 - в версии 8.32. PCRE2 всегда поддерживал все три кодировки UTF.

.

Многострочное сопоставление

^и $может совпадать только в начале и конце строки или в начале и конце каждой «строки» внутри строки, в зависимости от того, какие параметры установлены.

.

Параметры перехода на новую строку / перенос строки

При компиляции PCRE по умолчанию выбирается переход на новую строку. То, какая новая строка / перенос строки действует, влияет на то, где PCRE обнаруживает начало строки ^и конец $(в многострочном режиме), а также то, что соответствует точке (независимо от многострочного режима, если точкаall опция (? s)установлена). Это также влияет на процедуру сопоставления PCRE (начиная с версии 7.0): когда незакрепленный шаблон не удается сопоставить в начале последовательности новой строки, PCRE продвигается мимо всей последовательности новой строки перед повторной попыткой сопоставления. Если действующая альтернатива опции новой строки включает CRLF в качестве одного из допустимых разрывов строки, она не пропускает \ nв CRLF, если шаблон содержит определенные \ rили \ nссылок (начиная с версии 7.3). Начиная с версии 8.10, метасимвол \ Nвсегда соответствует любому символу, кроме символов перевода строки. Он имеет то же поведение, что и ., когда опция dotall aka (? S)не действует.

. Параметр новой строки может быть изменен с помощью внешних параметров, когда шаблон компилируется и когда он запускается. Немногие приложения, использующие PCRE, предоставляют пользователям возможность применить этот параметр через внешний параметр. Таким образом, параметр новой строки также может быть указан в начале шаблона, используя одно из следующего:

  • (* LF)Новая строка - это символ перевода строки.

    Соответствующие разрывы строк могут быть сопоставлены с \n.
  • (* CR)Новая строка - это возврат каретки.

    Соответствующие разрывы строк могут быть сопоставлены с \r.
  • (* CRLF)Новая строка / разрыв строки - это возврат каретки, за которым следует перевод строки.

    Соответствующие разрывы строк могут быть сопоставлены с \ r \ n.
  • (* ANYCRLF)Любое из вышеперечисленных, встречающихся в данных, вызовет обработку новой строки.

    Соответствующие разрывы строк могут быть сопоставлены с (?: \ r \ n ? | \ n)или с \R.

    См. ниже конфигурацию и параметры, касающиеся того, что соответствует обратной косой черте-R.

  • (* ANY)Любое из вышеперечисленных плюс специальные разрывы строк Unicode.

    Если нет в режиме UTF-8 соответствующие разрывы строк могут быть сопоставлены с (?: \ r \ n? | \ n | \ x0B | \ f | \ x85)или \R.

    В режиме UTF-8 два дополнительные символы распознаются как разрывы строк с помощью (* ANY):

    • LS (разделитель строк, U + 2028),
    • PS (пункт разделитель графиков, U + 2029).

    В Windows в данных, отличных от Unicode, некоторые из символов ANYразрыва строки имеют другое значение.

    Например, \ x85может соответствовать горизонтальному многоточию, и если он встречается во время действия ANYновой строки, это вызовет обработку новой строки.

    См. ниже конфигурацию и параметры, касающиеся того, что соответствует обратной косой черте-R.

.

Обратная косая черта- Параметры R

При компиляции PCRE по умолчанию выбирается то, что соответствует \ R. Значение по умолчанию может соответствовать разрывам строк, соответствующим ANYCRLF, или тем, которые соответствуют ANY. При необходимости значение по умолчанию может быть изменено путем включения (* BSR_UNICODE)или (* BSR_ANYCRLF)в начале шаблона. Предоставляя параметр (* BSR..), вы также можете указать параметр (* новая строка), например, (* BSR_UNICODE) (* ANY) остальная часть -паттерн. Параметры обратной косой черты-R также могут быть изменены с помощью внешних параметров приложением, вызывающим PCRE2, при компиляции шаблона.

.

Начало опций шаблона

Опции разрыва строки, такие как (* LF), задокументированные выше; параметры обратной косой черты-R, такие как (* BSR_ANYCRLF), задокументированные выше; Параметр свойств символа Юникода (* UCP)задокументирован выше; Параметр (* UTF8)задокументирован следующим образом: если ваша библиотека PCRE2 была скомпилирована с поддержкой UTF, вы можете указать параметр (* UTF)в начале шаблона вместо установки внешнего параметра для вызова режима UTF-8, UTF-16 или UTF-32.

.

Обратные ссылки

Шаблон может ссылаться на результаты предыдущего совпадения. Например, (a | b) c \ 1будет соответствовать либо «aca», либо «bcb» и не будет соответствовать, например, «acb».

.

Именованные подшаблоны

Подшаблон (окруженный круглыми скобками, например (...)) может быть назван путем включения начального ?Pпосле открывающего парентеза. Именованные подшаблоны - это функция, заимствованная PCRE из регулярных выражений Python.

Эта функция была впоследствии принята Perl, поэтому теперь именованные группы также могут быть определены с помощью (? ...)или (? 'Name'...), а также (? P ...). На именованные группы можно ссылаться, например: (? P = name)(синтаксис Python) или \ k'name '(синтаксис Perl).

.

Подпрограммы

В то время как обратная ссылка предоставляет механизм для ссылки на ту часть объекта, которая ранее соответствовала подшаблону, подпрограмма предоставляет механизм для повторного использования базового ранее определенного подшаблона. Параметры подшаблона, такие как независимость от регистра, фиксируются, когда подшаблон определен. (ac) (? 1)будет соответствовать "aacabc" или "abcadc", тогда как использование обратной ссылки (ac) \ 1не будет, хотя оба будут соответствовать "aacaac" или " abcabc ". PCRE также поддерживает не-Perl Oniguruma конструкцию для подпрограмм. Они указываются с помощью \gили \g.

.

Атомарная группировка

Атомарная группировка - это способ предотвращения обратного отслеживания в шаблоне. Например, a ++ bcбудет соответствовать как можно большему количеству "a" и никогда не будет выполнять резервное копирование, чтобы попробовать на один меньше.

.

Утверждения упреждающего и опережающего просмотра

УтверждениеЗаглядывая назадЗаглядывая вперед
Положительный(?<=образец)(?=образец)
Отрицательный(?(?!шаблон)
Утверждения просмотра назад и вперед. в Perl регулярных выражениях

Шаблоны могут утверждать, что предыдущий текст или последующий текст содержит шаблон без использования согласованного текста (утверждение нулевой ширины). Например, / \ w + (? = \ T)/ соответствует слову, за которым следует табуляция, без включения самой табуляции.

Утверждения ретроспективного просмотра не могут быть неопределенной длины, хотя (в отличие от Perl) каждая ветвь может иметь разную фиксированную длину.

\Kможно использовать в шаблоне для сброса начала текущего полного совпадения. Это обеспечивает гибкий альтернативный подход к утверждениям просмотра назад, поскольку отброшенная часть совпадения (часть, которая предшествует \ K) не требует фиксированной длины.

.

Управляющие последовательности для утверждений нулевой ширины

Например, \ bдля сопоставления "границ слова" нулевой ширины, аналогично (?<=\W)(?=\w)|(?<=\w)(?=\W)|^|$.

.

Комментарии

Комментарий начинается с (? #и заканчивается следующей закрывающей скобкой.

.

Рекурсивные шаблоны

Шаблон может ссылаться на себя рекурсивно или на любой подшаблон. Например, шаблон \ ((a * | (? R)) * \)будет соответствовать любой комбинации сбалансированных круглых скобок и «а».

.

Общие обозначения

Выражения PCRE могут включать (? C''n ''), где n - некоторое число. Это вызовет внешнюю пользовательскую функцию через API PCRE и может использоваться для встраивания произвольного кода в шаблон.

.

.

Отличия от Perl

Различия между PCRE2 и Perl (начиная с Perl 5.9. 4) включать, но не ограничиваться:

  • До выпуска 10.30 рекурсивные совпадения были атомарными в PCRE и неатомарными в Perl :

    Это означало, что "<!>!>><>>!>!>!>"= ~ / ^ (<(?:[^<>] + | (? 3) | (? 1)) *>) () (!>!>!>) $ /будет соответствовать в Perl, но не в PCRE2 до выпуска 10.30.

    .

  • Значение буфера захвата значение, полученное из квантификатора ?(совпадение 1 или 0 раз) при вложении в другой квантифицированный буфер захвата, отличается :

    В Perl «aba» = ~ / ^ (a (b)?) + $ /;приведет к $ 1, содержащему "a", и $ 2, содержащему undef, но в PCRE приведет к $ 2, содержащему "b ".

    .

  • PCRE позволяет давать именованным буферам захвата числовые имена; Perl требует, чтобы имя соответствовало правилу пустых слов :

    . Это означает, что \ g {}однозначно в Perl, но потенциально неоднозначно в PCRE.

    Это больше не разница, поскольку PCRE 8.34 (выпущен 15 декабря 2013 г.), в котором имена групп больше не могут начинаться с цифры.

    .

  • PCRE допускает, чтобы альтернативы в ретроспективе имели разную длину. :

    В утверждениях ретроспективного просмотра и PCRE, и Perl требуют шаблонов фиксированной длины.

    То есть и PCRE, и Perl запрещают шаблоны переменной длины.

    .

    Однако Perl требует, чтобы все альтернативные ветви утверждения просмотра назад были одинаковой длины, тогда как PCRE позволяет этим альтернативным ветвям иметь разную длину друг от друга, если каждая ветвь все еще имеет фиксированную длину.

    .

  • PCRE делает не поддерживают определенные «экспериментальные» конструкции Perl :

    , такие как (?? {...})(обратный вызов, возврат которого оценивается как часть шаблона), ни (? { }), хотя последняя может быть эмулирована с помощью (? Cn).

    глаголы управления рекурсией, добавленные в серию Perl 5.9.x, также не поддерживаются.

    .

    Поддержка экспериментальных глаголов управления возвратом ( добавлен в Perl 5.10) доступен в PCRE, начиная с версии 7.3.

    Это (* FAIL), (* F), (* PRUNE), (* SKIP), (* THEN), (* COMMIT)и (* ACCEPT).

    .

    Соответствующее использование Perl аргументы с управляющими командами поиска с возвратом обычно не поддерживаются.

    Однако обратите внимание, что, начиная с версии 8.10, PCRE поддерживает следующие команды с указанным аргументом: (* MARK: markName), ( * SKIP: markName), (* PRUNE: markName)и (* THEN: markName).

    .

    Начиная с версии 10.32 PCRE2 поддерживает (* ACCEPT: markName), (* FAIL: markName)и (* COMMIT: markName).

    .

  • PCRE и Perl немного отличаются по своей устойчивости к ошибочным конструкциям. :

    Perl позволяет использовать квантификаторы для (?!...)конструкция, которая бессмысленна, но безвредна (хотя и неэффективна); PCRE выдает ошибку в версиях до 8.13.

    .

  • PCRE имеет жесткое ограничение на глубину рекурсии, Perl не имеет :

    с параметрами сборки по умолчанию «bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa» = ~ /.X (. +) + X /не будет соответствовать из-за ограничения, но Perl будет соответствовать ему правильно.

    Perl использует кучу для рекурсии и не имеет жесткого ограничения на глубину рекурсии, тогда как PCRE2 имеет ограничение по умолчанию во время компиляции, которое может может быть изменен вызывающим приложением вверх или вниз.

    .

За исключением вышеупомянутых пунктов, PCRE может проходить тесты в файле Perl "t / op / re_tests", одном из основных Регрессионные тесты на уровне синтаксиса для механизма регулярных выражений Perl.

.

.

Примечания и ссылки

Примечания

  1. ^Базовая библиотека PCRE2 обеспечивает функции как сопоставления, так и сопоставления и замены.
  2. ^Конечно, часть \ x85не является \ xC2 \ x85? (т.е. (?: \ r \ n? | \ n | \ x0B | \ f | \ xC2 \ x85), as U + 0085 ! = 0x85).. Внимание! : если шаблон \ xC2 \ x85не сработал: поэкспериментируйте с настройками Unicode реализации RegEx или попробуйте заменить их следующим:
    • \ x {0085}
    • \ u0085

.

Ссылки

  1. ^
  2. ^
    • Exim и PCRE: Как свободные программы захватили мою жизнь (1999-12), Автор Филип Хейзел : https://www.ukuug.org/events/winter99/proc/PH.ps

      А как насчет PCRE?

      • Написано летом 1997 г., размещено на ftp-сайте.
      • Люди нашли это и начали список рассылки.
      • Было много улучшений.. - Exim и PCRE: Как свободные программы захватили мою жизнь, Стр. 7
  3. ^
  4. ^
  5. ^
  6. ^
    • Цитировать журнал изменений PCRE (https://www.pcre.org/original/changelog.txt ):

      Perl больше не позволяет именам групп начинаться с цифр, поэтому я внесли это изменение также в PCRE.

  7. ^

.

.

См. также

  • Портал бесплатного программного обеспечения с открытым исходным кодом

.

Внешние ссылки

Вычислительная служба Кембриджского университета (CSX )

Последняя правка сделана 2021-06-01 09:33:40
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте