Jump to content

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

(Перенаправлено с PCRE )
Perl-совместимые регулярные выражения
Оригинальный автор(ы) Филип Хейзел
Стабильный релиз(ы)
PCRE1 8.45 / 15 июня 2021 г .; 3 года назад ( 15.06.2021 ) [1]
PCRE2 10.43 / 16 февраля 2024 г .; 5 месяцев назад ( 16.02.2024 ) [2]
Репозиторий
Написано в С
Операционная система Кросс-платформенный
Тип сопоставления шаблонов Библиотека
Лицензия БСД
Веб-сайт pcre .org Отредактируйте это в Викиданных

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

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

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

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

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

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

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

[ редактировать ]

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

Последовательные правила побега

[ редактировать ]

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

Расширенные классы персонажей

[ редактировать ]

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

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

[ редактировать ]

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

Если U установлен флаг, то квантификаторы по умолчанию не жадные (ленивые), а ? делает их жадными.

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

[ редактировать ]

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

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

[ редактировать ]

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

Параметры новой строки/переноса строки

[ редактировать ]

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

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

  • (*LF) Новая строка — это символ перевода строки. Соответствующие разрывы строк можно сопоставить с \n.
  • (*CR) Новая строка — это возврат каретки. Соответствующие разрывы строк можно сопоставить с \r.
  • (*CRLF) Новая строка/переход строки — это возврат каретки, за которым следует перевод строки. Соответствующие разрывы строк можно сопоставить с \r\n.
  • (*ANYCRLF) Любое из вышеперечисленного, обнаруженное в данных, вызовет обработку новой строки. Соответствующие разрывы строк можно сопоставить с (?:\r\n?|\n) или с \R. Ниже приведены настройки и параметры соответствия обратной косой черты-R.
  • (*ANY) Любое из вышеперечисленного плюс специальные разрывы строк в Юникоде.

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

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

  • LS (разделитель строк, U+2028),
  • PS (разделитель абзацев, U+2029).

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

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

Ниже приведены настройки и параметры соответствия обратной косой черты-R.

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

[ редактировать ]

При компиляции PCRE по умолчанию выбирается то, что соответствует \R. По умолчанию может соответствовать либо разрывам строк, соответствующим ANYCRLF, либо соответствующим ANY. При необходимости значение по умолчанию можно переопределить, включив (*BSR_UNICODE) или (*BSR_ANYCRLF) в начале узора. При предоставлении (*BSR..) вариант, вы также можете предоставить (*newline) вариант, например, (*BSR_UNICODE)(*ANY)rest-of-pattern. Параметры обратной косой черты-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<name> после открывающей скобки. Именованные подшаблоны — это функция, заимствованная PCRE из регулярных выражений Python .

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

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

[ редактировать ]

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

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

[ редактировать ]

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

Утверждения просмотра вперед и назад

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

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

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

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

Escape-последовательности для утверждений нулевой ширины

[ редактировать ]

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

Комментарии

[ редактировать ]

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

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

[ редактировать ]

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

Общие уточнения

[ редактировать ]

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

Отличия от Perl

[ редактировать ]

Различия между PCRE2 и Perl (начиная с Perl 5.9.4) включают, помимо прочего: [6]

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

[ редактировать ]

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

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

[ редактировать ]

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

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

[ редактировать ]

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

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

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), как U+0085 != 0x85)

    Предостережение : если шаблон \xC2\x85 не помогло: поэкспериментируйте с настройками Unicode реализации RegEx или попробуйте заменить следующее:
    • \x{0085}
    • \u0085
  1. ^ Финальная версия PCRE1: https://lists.exim.org/lurker/message/20210615.162400.c16ff8a3.en.html .
  2. ^ Релизы: https://github.com/PCRE2Project/pcre2/releases.
  3. ^ Exim и PCRE: Как свободное программное обеспечение захватило мою жизнь (1999-12), Филип Хейзел , стр. 7: https://www.ukuug.org/events/winter99/proc/PH.ps

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

    • Написано летом 1997 года, размещено на ftp-сайте.
    • Люди нашли это и создали список рассылки.
    • Произошло несколько улучшений.
  4. ^
  5. ^ PCRE2 — регулярные выражения, совместимые с Perl (пересмотренный API) (2020 г.), Кембриджский университет : https://pcre.org/pcre2.txt
  6. ^ Различия между PCRE2 и Perl (13 июля 2019 г.), Филип Хейзел : https://www.pcre.org/current/doc/html/pcre2compat.html
  7. ^ Цитирую журнал изменений PCRE ( https://www.pcre.org/original/changelog.txt ): «Perl больше не позволяет именам групп начинаться с цифр, поэтому я внес это изменение и в PCRE».
  8. ^ Журнал изменений для PCRE2: https://www.pcre.org/changelog.txt .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 6244d75a2ba8841a1401720cc303dc84__1710196080
URL1:https://arc.ask3.ru/arc/aa/62/84/6244d75a2ba8841a1401720cc303dc84.html
Заголовок, (Title) документа по адресу, URL1:
Perl Compatible Regular Expressions - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)