![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Perl Regular Expression SyntaxBoost , Boost.Regex 5.1.2 , Regular Expression Syntax
|
Побег |
значение |
---|---|
< |
Сопоставьте все, что соответствует подвыражению 1 |
< |
Сопоставить все, что соответствует подвыражению 1: эта форма позволяет более безопасно анализировать выражение в таких случаях, как< |
< |
Матч, соответствующий последней открытой подэкспрессии |
< |
Матч, соответствующий последнему, но открытому суб-выражению |
< |
Матч, соответствующий подвыражению «один» |
Наконец, выход \k может быть использован для обозначения названных подвыражений, например<\k<two>
>будет соответствовать тому, что соответствует подвыражению, названному «два».
Оператор<|
>будет соответствовать любому из его аргументов, поэтому, например:<abc|def
>будет соответствовать либо «abc», либо «def».
Парентезис можно использовать для групповых чередований, например:<ab(d|ef)
>будет соответствовать либо «abd», либо «abef».
Пустые альтернативы не допускаются (это почти всегда ошибка), но если вы действительно хотите использовать пустую альтернативу<(?:)
>в качестве заполнителя, например:
<|abc
>не является действительным выражением, но
<(?:)|abc
>является и является эквивалентом выражения:
<(?:abc)??
>имеет тот же эффект.
Набор символов - это выражение скобки, начинающееся с<[] and ending
with
, оно определяет набор символов и соответствует любому отдельному персонажу, который является членом этого набора.>
Выражение скобки может содержать любую комбинацию из следующего:
Например,<[abc]
>, будет соответствовать любому из символов 'a', 'b' или 'c'.
Например,<[a-c]
>будет соответствовать любому одному персонажу в диапазоне от «a» до «c». По умолчанию для регулярных выражений Perl символ x находится в диапазоне от y до z, если кодовая точка символа находится в кодовых точках конечных точек диапазона. В качестве альтернативы, если вы устанавливаете флаг<collate
>при построении регулярного выражения, диапазоны чувствительны к локализации.
Если выражение скобки начинается с символа ^, то оно совпадает с дополнением символов, которые оно содержит, например<[^a-c]
>соответствует любому персонажу, который не находится в диапазоне<a-c
>.
Выражение формы<[[:name:]]
>соответствует названному классу символов «имя», например<[[:lower:]]
>соответствует любому персонажу нижнего регистра. См.названия классов символов.
Выражение формы<[[.col.]]
>соответствует коллационному элементуcol. Коллатинговый элемент — это любой одиночный символ или любая последовательность символов, которые коллатируются как единое целое. В качестве конечной точки диапазона могут также использоваться элементы коллатинга, например:<[[.ae.]-c]
>соответствует последовательности символов «ae», плюс любой одиночный символ в диапазоне «ae»-c, предполагая, что «ae» рассматривается как один элемент коллатинга в текущей локализации.
В качестве расширения элемент коллатинга может быть также указан через егосимволическое имя, например:
[[.NUL.]]
Совпадает с персонажем<\0
>.
Выражение формы<[[=col=]]
>соответствует любому символу или коллатеральному элементу, основной сорт-ключ которого такой же, как и для коллатерального элементаcol, так как с коллатеральными элементами имяcolможет бытьсимволическим именем. Основной сорт-ключ - это тот, который игнорирует случай, акцентацию или локализованные пошивы; так, например,<[[=a=]]
>соответствует любому из персонажей: a, & #192;, & #193;, & #194;, & #195;, & #196;, & #197;, A, & #224;, & #225;, & #226;, & #227;, & #228; и & #229;. К сожалению, реализация этого зависит от поддержки коллаборации и локализации платформы; на эту функцию нельзя полагаться для переносимости на всех платформах или даже во всех местах на одной платформе.
Все последовательности побега, которые соответствуют одному символу или одному классу символов, разрешены в определении класса символов. Например,<[\[\]]
>будет соответствовать либо<[
>, либо<]
>, в то время как<[\W\d]
>будет соответствовать любому символу, который является либо «цифрой»,илиявляется, а не«слова» символ.
Все вышеперечисленное можно объединить в одну декларацию набора символов, например:<[[:digit:]a-c[.NUL.]]
>.
Любой особый характер, которому предшествует побег, должен соответствовать самому себе.
Следующие последовательности бегства являются синонимами для отдельных символов:
Побег |
характер |
---|---|
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
Последовательность побега ASCII — символ, кодовая точка которого составляет X % 32 |
< |
Шестидесятичная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0xdd. |
< |
Шестидесятичная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0xdddd. |
< |
Октальная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0ddd. |
< |
Соответствует единственному символу, который имеетсимволическое имяимя. Например,< |
Любой сбежавший персонажx, еслиxявляется именем класса персонажей, должен соответствовать любому персонажу, который является членом этого класса, и любой сбежавший персонажX, еслиxявляется именем класса персонажей, должен соответствовать любому персонажу, не относящемуся к этому классу.
По умолчанию поддерживаются следующие:
Последовательность побега |
эквивалентный |
---|---|
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
Горизонтальное белое пространство |
< |
Вертикальное белое пространство |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
< |
Не горизонтальное белое пространство |
< |
Не вертикальное белое пространство |
Имена свойств символов в следующей таблице эквивалентны именам, используемым в классах символов.
форма |
Описание |
эквивалентная форма набора символов |
---|---|---|
< |
Соответствует любому символу, который имеет свойство X. |
< |
< |
Соответствует любому символу, имеющему имя свойства. |
< |
< |
Соответствует любому символу, который не обладает свойством X. |
< |
< |
Соответствует любому символу, который не имеет имени собственности. |
< |
Например,<\pd
>соответствует любому «цифровому» персонажу, как и<\p{digit}
>.
Следующие последовательности побега соответствуют границам слов:
<<
>Соответствует началу слова.
<>
>Соответствует концу слова.
<\b
>Соответствует границе слова (начало или конец слова).
<\B
>Соответствует только тогда, когда не на границе слова.
Следующее совпадение только на границах буфера: «буфер» в этом контексте - это весь входной текст, который сопоставляется с (обратите внимание, что ^ и $ могут соответствовать встроенным новым линиям в тексте).
\' Матчи только в начале буфера.
Матчи только в конце буфера.
Матчи только в начале буфера (то же самое, что<\`
>).
\z Совпадения только в конце буфера (то же самое, что<\'
>).
Z соответствует утверждению нулевой ширины, состоящему из необязательной последовательности новых линий в конце буфера: эквивалентно обычному выражению<(?=\v*\z)
>. Обратите внимание, что это тонко отличается от Perl, который ведет себя как подобие<(?=\n?\z)
>.
Последовательность<\G
>совпадает только в конце последнего найденного матча или в начале текста, если предыдущий матч не был найден. Этот выход полезен, если вы повторяете матчи, содержащиеся в тексте, и хотите, чтобы каждый последующий матч начинался там, где закончился последний.
Последовательность выхода<\Q
>начинается с «цитируемой последовательности»: все последующие символы рассматриваются как буквальные, пока не будет найден конец регулярного выражения или \E. Например, выражение:<\Q*+\Ea+
>соответствует любому из:
\*+a \*+aaa
<\C
>Соответствует одной точке кода: в Boost regex это имеет точно такой же эффект, как и оператор.<\X
>Соответствует комбинирующей последовательности символов: то есть любой некомбинирующий символ, за которым следует последовательность нулевых или более комбинирующих символов.
Последовательность выхода<\R
>совпадает с любой последовательностью окончания строки символа, в частности, она идентична выражению<(?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}])
>.
<\K
>Сбрасывает начальное местоположение $0 в текущую текстовую позицию: другими словами, все слева от \K «сохранено» и не является частью соответствия обычного выражения. $ обновляется соответствующим образом.
Например,<foo\Kbar
>, сопоставленный с текстом «foobar», вернул бы матч «bar» за $0 и «foo» за $’. Это может быть использовано для имитации утверждений с переменной шириной.
Любая другая последовательность побега соответствует персонажу, который ускользнул, например, @ соответствует буквальному @.
Перл-специфические расширения синтаксиса регулярных выражений начинаются с<(?
>.
Вы можете создать именованное подвыражение, используя:
(?<NAME>expression)
Назвать его можно по имениИмя. В качестве альтернативы вы можете разграничить имя, используя «Имя», как в:
(?'NAME'expression)
Эти названные подвыражения могут упоминаться в обратной ссылке, используя либо<\g{NAME}
>, либо<\k<NAME>
>, а также могут упоминаться по имени в. Perlформатирует строку для поиска и замены операций, или в<match_results
>функции-члены.
<(?# ... )
>рассматривается как комментарий, его содержание игнорируется.
<(?imsx-imsx ... )
>изменяет, какие из модификаторов perl действуют в пределах рисунка, изменения вступают в силу с точки, в которой блок впервые виден, и распространяются на любую оболочку<)
>. Письма перед '-' включите этот модификатор perl, письма после этого выключите его.
<(?imsx-imsx:pattern)
>применяет указанные модификаторы только к шаблону.
<(?:pattern)
>Лексически групповой паттерн, не порождающий дополнительной субэкспрессии.
<(?|pattern)
>сбрасывает подэкспрессионное число в начале каждой альтернативы « |» вшаблоне.
Подэкспрессионное число, следующее за этой конструкцией, — это количество ветвей, имеющих наибольшее количество подэкспрессий. Эта конструкция полезна, когда вы хотите захватить одно из нескольких альтернативных совпадений в одном подэкспрессионном индексе.
В следующем примере индекс каждого подвыражения показан ниже выражения:
# before ---------------branch-reset----------- after / ( a ) (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x # 1 2 2 3 2 3 4
<(?=pattern)
>потребляет ноль символов, только если шаблон совпадает.
<(?!pattern)
>потребляет ноль символов, только если шаблон не совпадает.
Lookahead обычно используется для создания логических и двух регулярных выражений, например, если пароль должен содержать букву нижнего регистра, букву верхнего регистра, символ пунктуации и иметь длину не менее 6 символов, то выражение:
(?=.*[[:lower:]])(?=.*[[:upper:]])(?=.*[[:punct:]]).{6,}
Можно использовать для проверки пароля.
<(?<=pattern)
>потребляет ноль символов, только если шаблон может быть сопоставлен с символами, предшествующими текущему положению (паттерн должен быть фиксированной длины).
<(?<!pattern)
>потребляет ноль символов, только если шаблон не может быть сопоставлен с символами, предшествующими текущему положению (паттерн должен быть фиксированной длины).
<(?>pattern)
>соответствует независимо от окружающих паттернов, выражение никогда не вернется к. Независимые суб-выражения обычно используются для повышения производительности; будет рассмотрено только наилучшее возможное соответствие для шаблона, если это не позволяет выражению в целом соответствовать, то совпадение не найдено вообще.
<(?N) (?-N) (?+N)
(?R) (?0) (?&NAME)
>
<(?R)
>и<(?0)
>возвращаются к началу всей картины.
<(?N)
>выполняет подвыражениеNрекурсивно, например<(?2)
>будет повторяться до подвыражения 2.
<(?-N)
>и<(?+N)
>являются относительными рекурсиями, поэтому, например,<(?-1)
>повторяется до последнего подвыражения, которое будет объявлено, и<(?+1)
>повторяется до следующего подвыражения, которое будет объявлено.
<(?&NAME)
>повторяется в названном суб-выраженииИмя.
<(?(condition)yes-pattern|no-pattern)
>пытается сопоставитьда-паттерн, еслиусловиеверно, в противном случае попытки сопоставитьне-паттерн.
<(?(condition)yes-pattern)
>пытается сопоставитьда-паттерн, если условиеверно, в противном случае соответствует строке NULL.
условиеможет быть либо: утверждением вперед, указателем отмеченного подвыражения (условие становится истинным, если подвыражение было сопоставлено), либо индексом рекурсии (условие становится истинным, если мы выполняем непосредственно внутри указанной рекурсии).
Вот краткое изложение возможных предикатов:
(?(?=assert)yes-pattern|no-pattern)
>Исполняетда-паттерн, если внешний вид вперед утверждает совпадения, в противном случае выполняетно-паттерн.(?(?!assert)yes-pattern|no-pattern)
>Исполняет«да-паттерн», если утверждение «смотрящий вперед» не совпадает, в противном случае выполняет«нет-паттерн».(?(N)yes-pattern|no-pattern)
>Выполняетда-паттерн, если подэкспрессияNбыла сопоставлена, в противном случае выполняетно-паттерн.(?(<name>)yes-pattern|no-pattern)
>Выполняетда-паттерн, если имя подэкспрессииимябыло сопоставлено, в противном случае выполняетно-паттерн.(?('name')yes-pattern|no-pattern)
>Выполняетда-паттерн, если подэкспрессияимябыла сопоставлена, в противном случае выполняетно-паттерн.(?(R)yes-pattern|no-pattern)
>Исполняетда-паттерн, если мы выполняем внутри рекурсии, в противном случае выполняетно-паттерн.(?(RN)yes-pattern|no-pattern)
>Исполняетда-паттерн, если мы выполняем внутри рекурсии к субэкспрессииN, в противном случае выполняетно-паттерн.(?(R&name)yes-pattern|no-pattern)
>Исполняетда-паттерн, если мы выполняем внутри рекурсии к названному подвыражениюимени, в противном случае выполняетно-паттерн.(?(DEFINE)never-exectuted-pattern)
>Определяет блок кода, который никогда не выполняется и не соответствует символам: он обычно используется для определения одного или нескольких названных подвыражений, которые упоминаются из других мест в шаблоне.Эта библиотека имеет частичную поддержку глаголов Perl, в частности (*MARK) не поддерживается. Между этой библиотекой и Perl также могут быть различия в поведении, не в последнюю очередь потому, что поведение Perl довольно недокументировано и часто несколько случайно. Поддерживаются следующие глаголы:
(*PRUNE)
>Не имеет никакого эффекта, если не вернуться назад, и в этом случае вся информация об обратном отслеживании до этого момента отбрасывается.(*SKIP)
>Ведет себя так же, как<(*PRUNE)
>, за исключением того, что предполагается, что никакое совпадение не может произойти до текущей точки в поисковой строке. Это может быть использовано для оптимизации поиска, пропуская фрагменты текста, которые уже определены, не могут сформировать совпадение.(*THEN)
>Не имеет никакого эффекта, если не вернуться назад, и в этом случае все последующие альтернативы в группе чередований отбрасываются.(*COMMIT)
>Не имеет никакого эффекта, если не отойдет назад, и в этом случае все последующие попытки сопоставления/поиска будут прекращены.(*FAIL)
>В этой точке матч выходит из строя без каких-либо условий и может быть использован для отката двигателя.(*ACCEPT)
>Причин, по которым паттерн считается соответствующим в текущей точке. Любые полуоткрытые суб-выражения закрыты в текущей точке.Порядок приоритета операторов выглядит следующим образом:
[==]
[::][..]
>\
>[]
>()
>* + ? {m,n}
>Если вы рассматриваете регулярное выражение как направленный (возможно, циклический) график, то лучшим найденным совпадением является первое совпадение, найденное при первом поиске глубины, выполненном на этом графике, при сопоставлении входного текста.
Альтернативно:
Наилучшим найденным матчем являетсялевый матч, с отдельными элементами, сопоставленными следующим образом;
строительство |
Что будет соответствовать |
---|---|
< |
Находится лучший матч дляAtomA, который имеет следующий матч дляAtomB . |
< |
ЕслиЭкспрессия1может быть сопоставлена, то возвращает это соответствие, в противном случае пытается сопоставитьЭкспрессия2. |
< |
МатчиSповторялись ровно N раз. |
< |
Матчи S повторяется между временами N и M и как можно чаще. |
< |
Матчи S повторяется между временами N и M и как можно реже. |
< |
То же, что< |
< |
То же, что< |
< |
Лучше всего подходит дляS, и только это. |
< |
Матчи только лучшее соответствие дляS(это видно только если есть захват скобки вS). |
< |
Рассматривает только то, существует ли совпадение для S или нет. |
< |
Если условие истинно, то рассматривается только «да-паттерн», в противном случае рассматривается только «нет-паттерн». |
опции<normal
>,<ECMAScript
>,<JavaScript
>и<JScript
>являются синонимами<perl
>.
Существуетмножество флагов, которые могут быть объединены с<perl
>опцией при построении регулярного выражения, в частности, обратите внимание, что опция<newline_alt
>изменяет синтаксис, в то время как опции<collate
>,<nosubs
>и<icase
>изменяют способ применения чувствительности корпуса и локализации.
Модификаторы perl<smix
>могут быть применены либо с использованием префикса<(?smix-smix)
>к регулярному выражению, либо с одним из флагов времени<no_mod_m
>,<mod_x
>,<mod_s
>и<no_mod_s
>.
Статья Perl Regular Expression Syntax раздела Boost.Regex 5.1.2 Regular Expression Syntax может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Regular Expression Syntax ::
реклама |