Синтаксис регулярных выражений POSIX-Basic используется утилитой Unix<sed
>, а вариации используются<grep
>и<emacs
>. В Boost можно создавать базовые регулярные выражения POSIX. Регекс посредством передачи флага<basic
>конструктору регекса (см.<syntax_option_type
>), например:
boost::regex e1(my_expression, boost::regex::basic);
boost::regex e2(my_expression, boost::regex::basic|boost::regex::icase);
В регулярных выражениях POSIX-Basic все символы совпадают друг с другом, за исключением следующих специальных символов:
.[\*^$
При использовании вне набора символов одиночный символ будет соответствовать любому отдельному символу, за исключением:
- Символ NULL, когда флаг<
match_no_dot_null
>передается алгоритмам соответствия.
- Новый символ линии, когда флаг<
match_not_dot_newline
>передается алгоритмам соответствия.
Персонаж «^» должен соответствовать началу строки при использовании в качестве первого символа выражения или первого символа подвыражения.
Символ «$» должен соответствовать концу строки при использовании в качестве последнего символа выражения или последнего символа подвыражения.
Раздел, начинающийся<\(
>и заканчивающийся<\)
>, действует как обозначенное подвыражение. Все, что соответствует подвыражению, разделено в отдельном поле алгоритмами сопоставления. Помеченные суб-выражения также могут повторяться или ссылаться на обратную ссылку.
Любой атом (единый символ, обозначенное подвыражение или класс символов) может быть повторен с оператором *.
Например,<a*
>будет совпадать с любым числом букв повторного нуля а или более раз (атом повторяется нулевое время совпадает с пустой строкой), поэтому выражение<a*b
>будет соответствовать любому из следующего:
b
ab
aaaaaaaab
Атом также может быть повторен с ограниченным повторением:
<a\{n\}
>Матчи «а» повторяются ровно n раз.
<a\{n,\}
>Матчи «а» повторяются n или более раз.
<a\{n,m\}
>Матчи 'a' повторяются между n и m раз включительно.
Например:
^a{2,3}$
Будет соответствовать любому из:
aa
aaa
Но ни один из них:
a
aaaa
Ошибкой является использование оператора повтора, если предыдущая конструкция не может быть повторена, например:
a(*)
Приведет к ошибке, так как оператору * нечего применять.
Характер побега, за которым следует цифраn, гдеnнаходится в диапазоне 1-9, соответствует той же строке, которая была сопоставлена субэкспрессиейn. Например, выражение:
^\(a*\).*\1$
Будет соответствовать струне:
aaabbaaa
Но только не струна:
aaabba
Набор символов - это выражение скобки, начиная с [и заканчивая ], оно определяет набор символов и соответствует любому отдельному персонажу, который является членом этого набора.
Выражение скобки может содержать любую комбинацию из следующего:
Например,<[abc]
>, будет соответствовать любому из символов 'a', 'b' или 'c'.
Например,<[a-c]
>будет соответствовать любому одному персонажу в диапазоне от «a» до «c». По умолчанию для POSIX-базовых регулярных выражений символxнаходится в диапазонеудоz, если он коллатирует в этом диапазоне; это приводит к специфическому поведению локализации. Это поведение можно отключить, отключив флаг опции<collate
>при построении регулярного выражения — в этом случае, появляется ли персонаж в диапазоне, определяется путем сравнения только кодовых точек символов.
Если выражение скобки начинается с символа ^, то оно совпадает с дополнением символов, которые оно содержит, например<[^a-c]
>соответствует любому символу, который не находится в диапазоне a-c.
Выражение формы<[[:name:]]
>соответствует названному классу символов «имя», например<[[:lower:]]
>соответствует любому персонажу нижнего регистра. См.названия классов.
Выражение формы<[[.col.]
>соответствует коллатеральному элементуcol. Коллатинговый элемент — это любой одиночный символ или любая последовательность символов, которые коллатируются как единое целое. В качестве конечной точки диапазона могут также использоваться элементы коллатинга, например:<[[.ae.]-c]
>соответствует последовательности символов «ae», плюс любой одиночный символ в диапазоне «ae»-c, предполагая, что «ae» рассматривается как один элемент коллатинга в текущей локализации.
Элементы коллайтинга могут использоваться вместо побегов (которые обычно не допускаются внутри наборов символов), например<[[.^.]abc]
>будет соответствовать любому из символов 'abc^'.
В качестве расширения коллатинговый элемент может быть также указан через его символическое название, например:
[[.NUL.]]
Совпадает с персонажем «NUL». См.названия элементов.
Выражение формы<[[=col=]]
>соответствует любому символу или коллатеральному элементу, основной сорт-ключ которого такой же, как и для коллатерального элемента, так как при коллатеральном элементе имяможет бытьколлатеральным символическим именем. Основной сорт-ключ - это тот, который игнорирует случай, акцентацию или локальные пошивы; так, например<[[=a=]]
>соответствует любому из персонажей: a, & #192;, & #193;, & #194;, & #195;, & #196;, & #197;, A, & #224;, & #225;, & #226;, & #227;, & #228; и & #229;. К сожалению, реализация этого зависит от поддержки коллаборации и локализации платформы; на эту функцию нельзя полагаться для переносимости на всех платформах или даже во всех местах на одной платформе.
Все вышеперечисленное можно объединить в одну декларацию набора символов, например:<[[:digit:]a-c[.NUL.]].
>
За исключением последовательностей побега \{, \}, \( и \), которые описаны выше, побег, за которым следует любой персонаж, соответствует этому персонажу. Это можно использовать для создания специальных символов.
.[\*^$
"обычный". Обратите внимание, что персонаж побега теряет свой особый смысл внутри набора персонажей, поэтому<[\^]
>будет соответствовать либо буквальному '', либо '''.
Когда есть более чем один способ соответствовать обычному выражению, «наилучший» возможный матч получается с использованиемлевое самое длинное правило.
Когда выражение скомпилировано с набором флага<grep
>, то выражение рассматривается как новый выделенный списокPOSIX-основных выражений, совпадение обнаруживается, если какое-либо из выражений в совпадении списка, например:
boost::regex e("abc\ndef", boost::regex::grep);
Он будет соответствовать любому изосновных выражений POSIX«abc» или «def».
Как следует из названия, такое поведение согласуется с утилитой Unix grep.
В дополнение кфункциям POSIX-Basicследующие символы также являются специальными:
Также распознаются следующие последовательности побегов:
Наконец, вы должны отметить, что регулярные выражения в стиле emacs соответствуют. Правила «глубинного первого поиска». Выражения Emacs совпадают таким образом, потому что они содержат Perl-подобные расширения, которые плохо взаимодействуют справилом в стиле POSIX.
Существуетмножество флагов, которые могут быть объединены с<basic
>и<grep
>опциями при построении регулярного выражения, в частности, обратите внимание, что<newline_alt
>,<no_char_classes
>,<no-intervals
>,<bk_plus_qm
>и<bk_plus_vbar
>опции изменяют синтаксис, в то время как<collate
>и<icase
>опцииизменяют способ применения чувствительности к случаю и локализации.
IEEE Std 1003.1-2001, Portable Operating System Interface (POSIX), Base Definitions and Headers, Section 9, Regular Expressions (FWD.1).
IEEE Std 1003.1-2001, Portable Operating System Interface (POSIX), Shells and Utilities, Section 4, Utilities, grep (FWD.1).
Emacs Версия 21.3.