Namespaces
Variants

std::regex_constants:: syntax_option_type

From cppreference.net
Определено в заголовочном файле <regex>
using syntax_option_type = /* implementation-defined */ ;
(1) (since C++11)
constexpr syntax_option_type icase = /* unspecified */ ;

constexpr syntax_option_type nosubs = /* unspecified */ ;
constexpr syntax_option_type optimize = /* unspecified */ ;
constexpr syntax_option_type collate = /* unspecified */ ;
constexpr syntax_option_type ECMAScript = /* unspecified */ ;
constexpr syntax_option_type basic = /* unspecified */ ;
constexpr syntax_option_type extended = /* unspecified */ ;
constexpr syntax_option_type awk = /* unspecified */ ;
constexpr syntax_option_type grep = /* unspecified */ ;

constexpr syntax_option_type egrep = /* unspecified */ ;
(2) (since C++11)
(inline since C++17)
inline constexpr syntax_option_type multiline = /* unspecified */ ;
(3) (since C++17)
1) syntax_option_type является BitmaskType , который содержит опции, определяющие поведение регулярных выражений.
2,3) Возможные значения ( 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

Смотрите также

объект регулярного выражения
(шаблон класса)