Регулярные выражения, совместимые с Perl - Perl Compatible Regular Expressions
Оригинальный автор (ы) | Филип Хейзел |
---|---|
Стабильный выпуск | PCRE 8.44 и PCRE2 10.35 / 9 мая 2020 г.[1] |
Репозиторий | |
Написано в | C |
Операционная система | Кроссплатформенность |
Тип | Сопоставление с образцом библиотека |
Лицензия | BSD |
Интернет сайт | www.pcre.org |
Регулярные выражения, совместимые с Perl (PCRE) это библиотека написано в C, который реализует регулярное выражение двигатель, вдохновленный возможностями Язык программирования Perl. Филип Хейзел начал писать PCRE летом 1997 г. [2]. Синтаксис PCRE намного более мощный и гибкий, чем любой из Регулярное выражение POSIX ароматизаторы (BRE, ERE) [3] и чем у многих других библиотек регулярных выражений.
Хотя PCRE изначально нацелен на эквивалентность функций с Perl, эти две реализации не полностью эквивалентны. На этапе PCRE 7.x и Perl 5.9.x эти два проекта координировали разработку, и функции переносились между ними в обоих направлениях. [4]
В 2015 году был выпущен форк PCRE с обновленным программным интерфейсом (API). В исходном программном обеспечении, которое теперь называется PCRE1 (серия 8.xx), были исправлены ошибки, но дальнейшего развития не было. Сейчас (2020 г.) он считается устаревшим, и текущий выпуск 8.44, вероятно, будет последним. Новый код PCRE2 (серия 10.xx) имеет ряд расширений и улучшений кодирования, и именно здесь происходит разработка.
Ряд известных программы с открытым исходным кодом, такой как Apache и Nginx HTTP-серверы и PHP и р языки сценариев, включают библиотеку 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
соответствует любой цифре точно как [[: цифра:]]
будет в регулярных выражениях POSIX.
Минимальное соответствие (также известное как «нелюбезный»)
А ?
может быть помещен после любого квантификатора повторения, чтобы указать, что следует использовать самое короткое совпадение. По умолчанию попытка самый длинный матч сначала и вернуться к более коротким совпадениям: например, а. *? б
будет соответствовать "ab" в "ababab", где а. * б
будет соответствовать всей строке.
Свойства символов Юникода
Unicode определяет несколько свойств для каждого символа. Шаблоны в PCRE2 могут соответствовать этим свойствам: например, \п{Ps}.*?\п{Пе}
будет соответствовать строке, начинающейся с любых «открывающих знаков препинания» и заканчивающихся любой «закрывающей пунктуацией», например [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 обнаруживает ^
линии начала и $
заканчивается (в многострочном режиме), а также то, что соответствует точке (независимо от многострочного режима, если только опция dotall (? s)
установлено). Это также влияет на процедуру сопоставления PCRE (начиная с версии 7.0): когда незакрепленный шаблон не удается сопоставить в начале последовательности новой строки, PCRE продвигается мимо всей последовательности новой строки перед повторной попыткой сопоставления. Если действующая альтернатива опции новой строки включает CRLF как один из допустимых разрывов строки, она не пропускает п
в CRLF, если шаблон содержит определенные р
или же п
ссылки (начиная с версии 7.3). Начиная с версии 8.10 метасимвол N
всегда соответствует любому символу, кроме символов перевода строки. Он ведет себя так же, как .
когда опция dotall aka (? s)
не действует.
Параметр новой строки можно изменить с помощью внешних параметров, когда шаблон компилируется и когда он запускается. Немногие приложения, использующие PCRE, предоставляют пользователям возможность применить этот параметр через внешний параметр. Таким образом, параметр новой строки также можно указать в начале шаблона, используя одно из следующих действий:
(* LF)
Новая строка - это символ перевода строки.- Соответствующие переводы строк могут быть сопоставлены с
п
.
- Соответствующие переводы строк могут быть сопоставлены с
(* CR)
Новая строка - это возврат каретки.- Соответствующие переводы строк могут быть сопоставлены с
р
.
- Соответствующие переводы строк могут быть сопоставлены с
(* CRLF)
Новая строка / перенос строки - это возврат каретки, за которым следует перевод строки.- Соответствующие переводы строк могут быть сопоставлены с
г п
.
- Соответствующие переводы строк могут быть сопоставлены с
(* ANYCRLF)
Любое из вышеперечисленного, встречающееся в данных, вызовет обработку новой строки.- Соответствующие переводы строк могут быть сопоставлены с
(?:\р\п?|\п)
или сР
.
См. Ниже конфигурацию и параметры того, что соответствует обратной косой черте-R.
- Соответствующие переводы строк могут быть сопоставлены с
(*ЛЮБОЙ)
Любое из вышеперечисленного плюс специальные разрывы строк Unicode.Когда не в режиме UTF-8, соответствующие разрывы строк могут быть сопоставлены с
(?:\р\п?|\п|\x0B|\ж|\x85)
[Заметка 2] или жеР
.В режиме UTF-8 два дополнительных символа распознаются как перенос строки с
(*ЛЮБОЙ)
:- LS (разделитель строк, U + 2028),
- PS (разделитель абзацев, U + 2029).
В Windows в данных, отличных от Unicode, некоторые из
ЛЮБОЙ
Символы переноса строки имеют другое значение.- Например,
x85
может соответствовать горизонтальному многоточию, и если встречается, когдаЛЮБОЙ
новая строка действует, это вызовет обработку новой строки.
См. Ниже конфигурацию и параметры того, что соответствует обратной косой черте-R.
Параметры обратной косой черты-R
При компиляции PCRE по умолчанию выбирается то, что соответствует Р
. Значение по умолчанию может соответствовать разрывам строк, соответствующим ANYCRLF, или тем, которые соответствуют ANY. При необходимости значение по умолчанию можно изменить, включив (* BSR_UNICODE)
или же (* BSR_ANYCRLF)
в начале узора. При предоставлении (* BSR ..)
вариант, вы также можете предоставить (*новая линия)
вариант, например, (* BSR_UNICODE) (* ЛЮБОЙ)остаток образца
. Параметры обратной косой черты-R также могут быть изменены с помощью внешних параметров, вызывая приложение PCRE2, когда шаблон компилируется.
Начало вариантов узора
Параметры разрыва строки, такие как (* LF)
задокументировано выше; параметры обратной косой черты-R, такие как (* BSR_ANYCRLF)
задокументировано выше; Параметр свойств символа Юникода (* UCP)
задокументировано выше; (* UTF8)
вариант, задокументированный следующим образом: если ваша библиотека PCRE2 была скомпилирована с UTF поддержку, вы можете указать (* UTF)
параметр в начале шаблона вместо установки внешнего параметра для вызова режима UTF-8, UTF-16 или UTF-32.
Обратные ссылки
Шаблон может относиться к результатам предыдущего совпадения. Например, (а | б) с 1
будет соответствовать "aca" или "bcb" и не будет соответствовать, например, "acb".
Именованные подшаблоны
Подшаблон (заключенный в круглые скобки, например (...)
) может быть назван включением ведущего ? P <имя>
после вскрытия парентеза. Именованные подшаблоны - это функция, заимствованная в PCRE. Python обычные выражения.
Впоследствии эта функция была принята в Perl, поэтому теперь именованные группы также можно определять с помощью (? <имя> ...)
или же (?'имя'...)
, а также (? P <имя> ...)
. На именованные группы можно ссылаться, например: (? P = имя)
(Синтаксис Python) или k'name '
(Синтаксис Perl).
Подпрограммы
В то время как обратная ссылка обеспечивает механизм для ссылки на ту часть объекта, которая ранее соответствовала подшаблону, подпрограмма предоставляет механизм для повторного использования базового ранее определенного подшаблона. Параметры подшаблона, такие как независимость от регистра, фиксируются, когда подшаблон определен. (a.c) (? 1)
будет соответствовать "aacabc" или "abcadc", тогда как при использовании обратной ссылки (а.с.) 1
не будет, хотя оба будут соответствовать "aacaac" или "abcabc". PCRE также поддерживает не-Perl Онигурума конструкция для подпрограмм. Они указаны с помощью g <номер-подписки>
или же g <имя-субпатента>
.
Атомная группировка
Атомная группировка - это способ предотвращения возврат в выкройке. Например, а ++ до н.э.
будет соответствовать как можно большему количеству "а" и никогда не будет делать резервную копию, чтобы попробовать на одну меньше.
Утверждения прогнозирования и ретроспективы
Утверждение | Смотреть за | Смотреть вперед |
---|---|---|
Положительный | (?<=шаблон) | (?=шаблон) |
Отрицательный | (?<!шаблон) | (?!шаблон) |
Утверждения с упреждением и прогнозом в Perl обычные выражения |
Шаблоны могут утверждать, что предыдущий текст или последующий текст содержит шаблон без использования совпадающего текста (утверждение нулевой ширины). Например, / ш + (? = т)
/ соответствует слову, за которым следует вкладка, без включения самой вкладки.
Утверждения просмотра назад не могут быть неопределенной длины, хотя (в отличие от Perl) каждая ветвь может иметь разную фиксированную длину.
K
может использоваться в шаблоне для сброса начала текущего совпадения. Это обеспечивает гибкий альтернативный подход к утверждениям просмотра назад, поскольку отброшенная часть совпадения (часть, которая предшествует K
) не нужно фиксировать по длине.
Управляющие последовательности для утверждений нулевой ширины
Например. b
для сопоставления "границ слова" нулевой ширины, аналогично (?<=\W)(?=\ш)|(?<=\ш)(?=\W)|^|$
.
Комментарии
Комментарий начинается с (?#
и заканчивается следующей закрывающей круглой скобкой.
Рекурсивные шаблоны
Шаблон может ссылаться на себя рекурсивно или на любой подшаблон. Например, узор \((а*|(?р))*\)
будет соответствовать любой комбинации сбалансированных круглых скобок и "а".
Общие уточнения
Выражения PCRE могут встраиваться (? C''n '')
, куда п это какое-то число. Это вызовет внешнюю определяемую пользователем функцию через API PCRE и может использоваться для встраивания произвольного кода в шаблон.
Отличия от Perl
Этот раздел должен быть обновлено. Причина этого: приведенная ниже ссылка относится к Perl 5.26.Сентябрь 2020) ( |
Различия между PCRE2 и Perl (начиная с Perl 5.9.4) включают, но не ограничиваются: [5]
До выпуска 10.30 рекурсивные совпадения были атомарными в PCRE и неатомарными в Perl:
Это означало, что
"<<!>!>!>><>>!>!>!>" =~ /^(<(?:[^<>]+|(?3)|(?1))*>)()(!>!>!>)$/
будет соответствовать в Perl, но не в PCRE2 до выпуска 10.30.Значение буфера захвата, полученное из
?
квантификатор (совпадение 1 или 0 раз) при вложении в другой количественный буфер захвата отличается:В Perl
"аба" =~ / ^ (а (б)?) + $ /;
приведет к$1
содержащий "а" и$2
содержащийundef
, но в PCRE приведет к$2
содержащий "b".PCRE позволяет давать именованным буферам захвата числовые имена; Perl требует, чтобы имя соответствовало правилу голых слов:
Это означает, что
грамм{}
однозначно в Perl, но потенциально неоднозначно в PCRE.Это больше не разница, начиная с PCRE 8.34 (выпущенного 15 декабря 2013 г.), который больше не позволяет названиям групп начинаться с цифры. [6]
PCRE позволяет альтернативам в ретроспективе иметь разную длину:
В утверждениях просмотра назад и PCRE, и Perl требуют шаблонов фиксированной длины.
То есть и PCRE, и Perl запрещают шаблоны переменной длины.
Однако Perl требует, чтобы все альтернативные ветви утверждения просмотра назад были одинаковой длины, тогда как PCRE позволяет этим альтернативным ветвям иметь разную длину друг от друга, если каждая ветвь все еще имеет фиксированную длину.
PCRE не поддерживает определенные "экспериментальные" конструкции Perl.:
Такие как
(??{...})
(обратный вызов, возврат которого оценивается как часть шаблона), ни(?{})
конструкция, хотя последняя может быть эмулирована с помощью(? Cn)
.Команды управления рекурсией, добавленные в серию Perl 5.9.x, также не поддерживаются.
Поддержка экспериментальных команд управления возвратом (добавлена в Perl 5.10) доступна в PCRE, начиная с версии 7.3.
Они есть
(*ПРОВАЛ)
,(* F)
,(*ЧЕРНОСЛИВ)
,(*ПРОПУСКАТЬ)
,(*ТОГДА)
,(*СОВЕРШИТЬ)
, и(*ПРИНИМАТЬ)
.Соответствующее использование аргументов Perl с управляющими командами с возвратом обычно не поддерживается.
Однако обратите внимание, что, начиная с версии 8.10, PCRE поддерживает следующие команды с указанным аргументом:
(* MARK: markName)
,(* SKIP: markName)
,(* PRUNE: markName)
, и(* ТО: markName)
.Начиная с версии 10.32 PCRE2 поддерживает
(* ПРИНЯТЬ: markName)
,(* FAIL: markName)
, и(* COMMIT: markName)
.PCRE и Perl немного различаются по своей устойчивости к ошибочным конструкциям.:
Perl позволяет использовать квантификаторы
(?!...)
конструкция, которая бессмысленна, но безвредна (хоть и неэффективна); PCRE выдает ошибку в версиях до 8.13.PCRE имеет жесткие ограничения на глубину рекурсии, Perl - нет.:
С параметрами сборки по умолчанию
"bbbbXcXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" =~ /.X(.+)+X/
не будет соответствовать из-за ограничения, но Perl будет соответствовать этому правильно.Perl использует кучу для рекурсии и не имеет жесткого ограничения на глубину рекурсии, тогда как PCRE2 имеет ограничение по умолчанию на время компиляции, которое может быть увеличено или уменьшено вызывающим приложением.
За исключением вышеперечисленных пунктов, PCRE может пройти тесты на Perl "t / op / re_tests
"файл, один из основных регрессионных тестов на уровне синтаксиса для механизма регулярных выражений Perl.
Примечания и ссылки
Примечания
- ^ Базовая библиотека PCRE2 обеспечивает функции сопоставления и сопоставления и замены.
- ^ Конечно
\x85
часть не\xC2\x85
? (т.е.(?:\р\п?|\п|\x0B|\ж|\xC2\x85)
, так как U + 0085 ! = 0x85)
Предостережение: Если узор\xC2\x85
не удалось: поэкспериментируйте с настройками Unicode реализации RegEx или попробуйте заменить их следующим:\Икс{0085}
\u0085
Рекомендации
- ^
- Индекс / pub / pcre /: https://ftp.pcre.org/pub/pcre/
- ^
- Exim и PCRE: Как свободные программы захватили мою жизнь (1999-12), автор: Филип Хейзел: https://www.ukuug.org/events/winter99/proc/PH.ps
А как насчет PCRE?
- Написано летом 1997 г., размещено на ftp-сайте.
- Люди нашли его и начали рассылку.
- Было несколько улучшений.
- Exim и PCRE: Как свободные программы захватили мою жизнь, Стр. 7
- Exim и PCRE: Как свободные программы захватили мою жизнь (1999-12), автор: Филип Хейзел: https://www.ukuug.org/events/winter99/proc/PH.ps
- ^
- Регулярное выражение - стандарт POSIX (поиск Google): https://www.google.com/search?num=100&q=%22Regular+Expression%22%7C%22Regular+Expressions%22%7C%22RegEx%22%7C%22RegExp%22+site%3Apubs.opengroup.org + inurl% 3Aonlinepubs% 2F9699919799 + -intitle% 3A% 22Index + of +% 2Fonlinepubs% 22 + -inurl% 3Aidx + -inurl% 3Acontents.html + -inurl% 3Atoc.html + -inurl% 3Ainurlition + 3Atoc.html + -inurl% 3Ainurlition + 3Atoc.html + -inurl% 3Ainurlition + 3Atoc.html + -inurl% 3Ainurlition + - inurl% 3A2016edition + -inurl% 3A2018edition
- Утилиты § Обозначение сопоставления с образцом: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#tag_18_13
- Базовые определения § Основные регулярные выражения: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/V1_chap09.html#tag_09_03
- Обоснование § Регулярные выражения: https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/xrat/V4_xbd_chap09.html#tag_21_09
- ^
- PCRE2 - Perl-совместимые регулярные выражения (пересмотренный API) (2020), автор: Кембриджский университет: https://pcre.org/pcre2.txt
- ^
- Различия между PCRE2 и Perl (13.07.2019), автор: Филип Хейзел: https://www.pcre.org/current/doc/html/pcre2compat.html
- ^
- Цитата из журнала изменений PCRE (https://www.pcre.org/original/changelog.txt ):
Perl больше не позволяет названиям групп начинаться с цифр, поэтому я внес это изменение также в PCRE.
- Цитата из журнала изменений PCRE (https://www.pcre.org/original/changelog.txt ):
- ^
- Журнал изменений для PCRE2: https://www.pcre.org/changelog.txt
Смотрите также
внешняя ссылка
- Официальный веб-сайт
- PCRE - Список рассылки разработчиков: https://lists.exim.org/mailman/listinfo/pcre-dev
- PCRE - Отслеживание ошибок: https://bugs.exim.org/describecomponents.cgi?product=PCRE
Вычислительная служба Кембриджского университета (CSX )
- Сопоставление с образцом с использованием регулярных выражений (02.03.2010), Ник Макларен, Филип Хейзел: https://www-uxsup.csx.cam.ac.uk/courses/moved.REs/paper.pdf
- pcre 8.43 (2019-04) - Windows Cygwin x86-64: https://www-uxsup.csx.cam.ac.uk/pub/windows/cygwin/x86_64/release/pcre/