std::regex_constants:: syntax_option_type
|
Определено в заголовочном файле
<regex>
|
||
|
using
syntax_option_type
=
/* implementation-defined */
;
|
(1) | (since C++11) |
|
constexpr
syntax_option_type icase
=
/* unspecified */
;
constexpr
syntax_option_type nosubs
=
/* unspecified */
;
|
(2) |
(since C++11)
(inline since C++17) |
|
inline
constexpr
syntax_option_type multiline
=
/* unspecified */
;
|
(3) | (since C++17) |
syntax_option_type
является
BitmaskType
, который содержит опции, определяющие поведение регулярных выражений.
icase
,
optimize
, и т.д.) для типа
(1)
дублируются внутри
std::basic_regex
.
Содержание |
Константы
| Вариант грамматики | Эффект(ы) |
ECMAScript
|
Использовать модифицированную грамматику регулярных выражений ECMAScript . |
basic
|
Использовать базовую грамматику регулярных выражений POSIX ( документация по грамматике ). |
extended
|
Использовать расширенную грамматику регулярных выражений POSIX ( документация по грамматике ). |
awk
|
Использовать грамматику регулярных выражений, применяемую утилитой awk в POSIX ( документация по грамматике ). |
grep
|
Использовать грамматику регулярных выражений, применяемую утилитой
grep
в POSIX. Это фактически то же самое, что опция
basic
с добавлением символа новой строки
'
\n
'
в качестве разделителя альтернатив.
|
egrep
|
Использовать грамматику регулярных выражений, применяемую утилитой
grep
с опцией
-E
в POSIX. Это фактически то же самое, что опция
extended
с добавлением символа новой строки
'
\n
'
в качестве дополнительного разделителя альтернатив наряду с
'|'
.
|
| Вариация грамматики | Эффект(ы) |
icase
|
Сравнение символов должно выполняться без учета регистра. |
nosubs
|
При выполнении сопоставлений все помеченные подвыражения
(
expr
)
обрабатываются как непомеченные подвыражения
(?:
expr
)
. Никакие сопоставления не сохраняются в предоставленной структуре
std::regex_match
и
mark_count()
равен нулю.
|
optimize
|
Указывает механизму регулярных выражений ускорить сопоставление ценой возможного замедления построения. Например, это может означать преобразование недетерминированного КА в детерминированный КА. |
collate
|
Диапазоны символов вида "[a-b]" будут учитывать локаль. |
multiline
(C++17)
|
Указывает, что
^
должен сопоставляться с началом строки, а
$
должен сопоставляться с концом строки, если выбран механизм ECMAScript.
|
Из опций грамматики может быть выбрана не более чем одна из
ECMAScript
,
basic
,
extended
,
awk
,
grep
,
egrep
. Если грамматика не выбрана, считается, что выбрана
ECMAScript
. Остальные опции служат вариациями, так что
std::
regex
(
"meow"
, std
::
regex
::
icase
)
эквивалентно
std::
regex
(
"meow"
, std
::
regex
::
ECMAScript
|
std
::
regex
::
icase
)
.
Примечания
Поскольку POSIX использует правило "самый левый самый длинный" (сопоставляется самая длинная совпадающая подпоследовательность, а если есть несколько таких подпоследовательностей, то выбирается первая), оно не подходит, например, для разбора языков разметки: POSIX-регулярное выражение, такое как "<tag[^>]*>.*</tag>" , будет сопоставлять всё от первого "<tag" до последнего "</tag>" , включая все "</tag>" и "<tag>" между ними. С другой стороны, ECMAScript поддерживает нежадные сопоставления, и ECMAScript-регулярное выражение "<tag[^>]*>.*?</tag>" будет сопоставлять только до первого закрывающего тега.
Пример
Иллюстрирует разницу в алгоритме сопоставления между регулярными выражениями ECMAScript и POSIX:
#include <iostream> #include <regex> #include <string> int main() { std::string str = "zzxayyzz"; std::regex re1(".*(a|xayy)"); // ECMA std::regex re2(".*(a|xayy)", std::regex::extended); // POSIX std::cout << "Searching for .*(a|xayy) in zzxayyzz:\n"; std::smatch m; std::regex_search(str, m, re1); std::cout << " ECMA (depth first search) match: " << m[0] << '\n'; std::regex_search(str, m, re2); std::cout << " POSIX (leftmost longest) match: " << m[0] << '\n'; }
Вывод:
Searching for .*(a|xayy) in zzxayyzz: ECMA (depth first search) match: zzxa POSIX (leftmost longest) match: zzxayy
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2053 | C++11 | константы были объявлены static | удалён спецификатор static |
Смотрите также
|
(C++11)
|
объект регулярного выражения
(шаблон класса) |