Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

POSIX Extended Regular Expression Syntax

Boost , Boost.Regex 5.1.2 , Regular Expression Syntax

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Synopsis

Синтаксис регулярных выражений POSIX-Extended поддерживается API регулярных выражений POSIX C, а вариации используются утилитами<egrep>и<awk>. Вы можете создавать расширенные регулярные выражения POSIX в Boost. Регекс путем передачи флага<extended>конструктору регекса, например:

// e1 is a case sensitive POSIX-Extended expression:
boost::regex e1(my_expression, boost::regex::extended);
// e2 a case insensitive POSIX-Extended expression:
boost::regex e2(my_expression, boost::regex::extended|boost::regex::icase);

POSIX Extended Syntax

В POSIX-расширенных регулярных выражениях все символы совпадают друг с другом, за исключением следующих специальных символов:

.[{}()\*+?|^$
Wildcard:

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

  • Символ NULL при переходе флага<match_no_dot_null>на соответствующие алгоритмы.
  • Новый символ линии, когда флаг<match_not_dot_newline>передается алгоритмам соответствия.
Anchors:

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

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

Marked sub-expressions:

Раздел, начинающийся<(>и заканчивающийся<)>, действует как обозначенное подвыражение. Все, что соответствует подвыражению, разделено в отдельном поле алгоритмами сопоставления. Помеченные подвыражения также могут повторяться или упоминаться посредством обратной ссылки.

Repeats:

Любой атом (единый символ, обозначенное подвыражение или класс символов) может быть повторен с операторами<*>,<+>,<?>и<{}>.

Оператор<*>будет соответствовать предыдущему атомунулю или более раз, например выражение<a*b>будет соответствовать любому из следующего:

b
ab
aaaaaaaab

Оператор<+>будет соответствовать предыдущему атомуодин или более раз, например, выражение a+b будет соответствовать любому из следующего:

ab
aaaaaaaab

Но не будет соответствовать:

b

Оператор<?>будет соответствовать предыдущему атомунулю или один раз, например выражение<ca?b>будет соответствовать любому из следующего:

cb
cab

Но не будет соответствовать:

caab

Атом также может быть повторен с ограниченным повторением:

<a{n}>Матчи «а» повторяютсяровно n раз.

<a{n,}>Матчи «а» повторяютсяn или более раз.

<a{n,m}>Матчи 'а' повторяютсямежду n и m раз включительно.

Например:

^a{2,3}$

Будет соответствовать любому из:

aa
aaa

Но ни один из них:

a
aaaa

Ошибкой является использование оператора повтора, если предыдущая конструкция не может быть повторена, например:

a(*)

Это приведет к возникновению ошибки, поскольку оператору<*>нечего применять.

Back references:

Характер побега, за которым следует цифраn, гдеnнаходится в диапазоне 1-9, соответствует той же строке, которая была сопоставлена субэкспрессиейn. Например, выражение:

^(a*).*\1$

Будет соответствовать струне:

aaabbaaa

Но только не струна:

aaabba
[Caution] Caution

Стандарт POSIX не поддерживает обратные ссылки для «расширенных» регулярных выражений.

Alternation

Оператор<|>будет соответствовать любому из своих аргументов, поэтому, например:<abc|def>будет соответствовать либо «abc», либо «def».

Парентезис можно использовать для групповых чередований, например:<ab(d|ef)>будет соответствовать либо «abd», либо «abef».

Character sets:

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

Выражение скобки может содержать любую комбинацию из следующего:

Single characters:

Например,<[abc]>, будет соответствовать любому из символов 'a', 'b' или 'c'.

Character ranges:

Например,<[a-c]>будет соответствовать любому одному персонажу в диапазоне от «a» до «c». По умолчанию для POSIX-расширенных регулярных выражений символxнаходится в диапазонеудоz, если он коллатирует в этом диапазоне; это приводит к специфическому поведению локализации. Это поведение можно отключить, отключив флаг опции<collate>— в этом случае, появляется ли персонаж в диапазоне, определяется путем сравнения только кодовых точек символов.

Negation:

Если выражение скобки начинается с символа ^, то оно совпадает с дополнением символов, которые оно содержит, например<[^a-c]>соответствует любому персонажу, который не находится в диапазоне<a-c>.

Character classes:

Выражение формы<[[:name:]]>соответствует названному классу символов «имя», например<[[:lower:]]>соответствует любому персонажу нижнего регистра. См.названия классов.

Collating Elements:

Выражение формы<[[.col.]>соответствует коллационному элементуcol. Коллатеральный элемент - это любой один символ или любая последовательность символов, которые коллатируются как единое целое. В качестве конечной точки диапазона могут также использоваться коллационные элементы, например:<[[.ae.]-c]>соответствует последовательности символов «ae», плюс любой одиночный символ в диапазоне «ae»-c, предполагая, что «ae» рассматривается как один коллатинговый элемент в текущей локализации.

Элементы коллайтинга могут использоваться вместо побегов (которые обычно не допускаются внутри наборов символов), например<[[.^.]abc]>будет соответствовать любому из символов 'abc^'.

В качестве расширения коллатинговый элемент может быть также указан через егосимволическое имя, например:

[[.NUL.]]

Соответствует NUL-персонажу.

Equivalence classes:

Выражение формы<[[=col=]]>соответствует любому символу или коллатеральному элементу, основной сорт-ключ которого такой же, как и для коллатерального элемента, так как при коллатеральных элементах имяможет бытьсимволическим именем. Основной сорт-ключ - это тот, который игнорирует случай, акцентацию или локальные пошивы; так, например,<[[=a=]]>соответствует любому из персонажей: a, & #192;, & #193;, & #194;, & #195;, & #196;, & #197;, A, & #224;, & #225;, & #226;, & #227;, & #228; и & #229;. К сожалению, реализация этого зависит от поддержки коллаборации и локализации платформы; на эту функцию нельзя полагаться, чтобы она работала переносимо на всех платформах или даже во всех местах на одной платформе.

Combinations:

Все вышеперечисленное можно объединить в одну декларацию набора символов, например:<[[:digit:]a-c[.NUL.]]>.

Escapes

Стандарт POSIX не определяет последовательности выхода для регулярных выражений POSIX-Extended, за исключением того, что:

  • Любой особый характер, которому предшествует побег, должен соответствовать самому себе.
  • Эффект любого обычного характера, которому предшествует побег, не определен.
  • Побег внутри декларации класса символов должен соответствовать самому себе: другими словами, характер побега не является «особым» внутри декларации класса символов; поэтому<[\^]>будет соответствовать либо буквальному '', либо '''.

Однако это довольно ограничительно, поэтому следующие стандартно совместимые расширения также поддерживаются Boost. Регекс:

Escapes matching a specific character

Следующие последовательности бегства являются синонимами для отдельных символов:

Побег

характер

\a

'а'

\e

0x1B

\f

\f

\n

\n

\r

\r

\t

\t

\v

\v

\b

\b (но только внутри объявления класса символов).

\cX

Последовательность побега ASCII — символ, кодовая точка которого составляет X % 32

\xdd

Шестидесятичная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0xdd.

\x{dddd}

Шестидесятичная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0xdddd.

0ddd

Октальная последовательность побега — соответствует единственному персонажу, кодовая точка которого 0ddd.

\N{Имя}

Соответствует единственному символу, который имеет символическое имяИмя. Например,<\\N{newline}>соответствует единственному символу

.
"Single character" character classes:

Любой сбежавший персонажx, еслиxявляется именем класса персонажей, должен соответствовать любому персонажу, который является членом этого класса, и любой сбежавший персонажX, еслиxявляется именем класса персонажей, должен соответствовать любому персонажу, не относящемуся к этому классу.

По умолчанию поддерживаются следующие:

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

эквивалентный

<\d>

<[[:digit:]]>

<\l>

<[[:lower:]]>

<\s>

<[[:space:]]>

<\u>

<[[:upper:]]>

<\w>

<[[:word:]]>

<\D>

<[^[:digit:]]>

<\L>

<[^[:lower:]]>

<\S>

<[^[:space:]]>

<\U>

<[^[:upper:]]>

<\W>

<[^[:word:]]>

Character Properties

Имена свойств символов в следующей таблице эквивалентны именам, используемым в классах символов.

форма

Описание

эквивалентная форма набора символов

<\pX>

Соответствует любому символу, который имеет свойство X.

<[[:X:]]>

<\p{Name}>

Соответствует любому символу, имеющему имя свойства.

<[[:Name:]]>

<\PX>

Соответствует любому символу, который не обладает свойством X.

<[^[:X:]]>

<\P{Name}>

Соответствует любому персонажу, у которого нет имени собственности.

<[^[:Name:]]>

Например,<\pd>соответствует любому «цифровому» персонажу, как и<\p{digit}>.

Word Boundaries

Следующие последовательности побега соответствуют границам слов:

Побег

значение

<\<>

Соответствует началу слова.

<\>>

Соответствует концу слова.

<\b>

Соответствует границе слова (начало или конец слова).

<\B>

Соответствует только тогда, когда не на границе слова.

Buffer boundaries

Следующее совпадение только на границах буфера: «буфер» в этом контексте - это весь входной текст, который сопоставляется с (обратите внимание, что ^ и $ могут соответствовать встроенным новым линиям в тексте).

Побег

значение

Матчи только в начале буфера.

Матчи только в конце буфера.

<\A>

Матчи только в начале буфера (то же самое, что и \').

<\z>

Матчи только в конце буфера (то же, что и \').

<\Z>

Сопоставляет необязательную последовательность новых линий в конце буфера: эквивалентно обычному выражению<\n*\z>

Continuation Escape

Последовательность<\G>совпадает только в конце последнего найденного матча или в начале текста, если предыдущий матч не был найден. Этот выход полезен, если вы повторяете матчи, содержащиеся в тексте, и хотите, чтобы каждый последующий матч начинался там, где закончился последний.

Quoting escape

Последовательность выхода<\Q>начинает «цитируемую последовательность»: все последующие символы трактуются как буквальные, пока не будет найден либо конец регулярного выражения, либо<\E>. Например, выражение:<\Q\*+\Ea+>соответствует любому из:

\*+a
\*+aaa
Unicode escapes

Побег

значение

<\C>

Соответствует одной точке кода: в Boost regex это имеет точно такой же эффект, как и оператор.

<\X>

Сопоставляет комбинирующую последовательность символов: то есть любой некомбинирующий символ, за которым следует последовательность нулевых или более комбинирующих символов.

Any other escape

Любая другая последовательность побега соответствует персонажу, который ускользнул, например, @ соответствует буквальному @.

Operator precedence

Порядок приоритета операторов выглядит следующим образом:

  1. Связанные с коллацией символы скобок<[==] [::][..]>
  2. Сбежавшие персонажи<\>
  3. Набор символов (выражение кронштейна)<[]>
  4. Группа<()>
  5. Односимвольное дублирование ERE<* +? {m,n}>
  6. конкатенация
  7. Анчоринг ^$
  8. Альтернатива<|>
What Gets Matched

Когда существует более чем один способ соответствия обычному выражению, «наилучшее» возможное соответствие получается с использованиемлевое самое длинное правило.

Variations

Egrep

Когда выражение скомпилировано с наборомфлага<egrep>, то выражение рассматривается как новый выделенный списоквыражений POSIX-Extended, совпадение обнаруживается, если любое из выражений в совпадении списка, например:

boost::regex e("abc\ndef", boost::regex::egrep);

Соответствует любому из основных выражений POSIX «abc» или «def».

Как следует из названия, такое поведение согласуется с утилитой Unix<egrep>и с грэпом при использовании с опцией -E.

awk

В дополнение кфункциям POSIX-Extendedубегающий символ является специальным внутри объявления класса символов.

Кроме того, необходимо поддерживать некоторые последовательности выхода, которые не определены как часть спецификации POSIX-Extended, однако Boost. Regex поддерживает их по умолчанию.

Options

Существуетразнообразие флагов, которые могут быть объединены с<extended>и<egrep>вариантами при построении регулярного выражения, в частности, обратите внимание, что<newline_alt>опция изменяет синтаксис, в то время как<collate>,<nosubs>и<icase>опцииизменяют способ применения чувствительности к регистру и локализации.

References

IEEE Std 1003.1-2001, Portable Operating System Interface (POSIX), Base Definitions and Headers, Section 9, Regular Expressions.

IEEE Std 1003.1-2001, Portable Operating System Interface (POSIX), Shells and Utilities, Section 4, Utilities, egrep.

IEEE Std 1003.1-2001, Portable Operating System Interface (POSIX), Shells and Utilities, Section 4, Utilities, awk.


PrevUpHomeNext

Статья POSIX Extended Regular Expression Syntax раздела Boost.Regex 5.1.2 Regular Expression Syntax может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Regular Expression Syntax ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 22:06:11/0.014266014099121/1