Spec-Zone.ru › C++

std::regex_constants::syntax_option_type

Определено в заголовке <regex>
using syntax_option_type = /* implementation-defined */;
(1) (с C++11)
(2)
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 */;
(с C++11)
(до C++17)
inline constexpr syntax_option_type icase      = /* unspecified */;
inline constexpr syntax_option_type nosubs     = /* unspecified */;
inline constexpr syntax_option_type optimize   = /* unspecified */;
inline constexpr syntax_option_type collate    = /* unspecified */;
inline constexpr syntax_option_type ECMAScript = /* unspecified */;
inline constexpr syntax_option_type basic      = /* unspecified */;
inline constexpr syntax_option_type extended   = /* unspecified */;
inline constexpr syntax_option_type awk        = /* unspecified */;
inline constexpr syntax_option_type grep       = /* unspecified */;
inline constexpr syntax_option_type egrep      = /* unspecified */;
(с C++17)
inline constexpr syntax_option_type multiline  = /* unspecified */;
(3) (с C++17)
1) Переменная syntax_option_type представляет собой BitmaskType, содержащую опции, определяющие поведение регулярных выражений.
2,3) Возможные значения (icase, optimize, и т. д.) для типа (1) дублируются внутри std::basic_regex.

Константы

Значение Эффект(ы)
icase Сопоставление символов должно выполняться без учета регистра.
nosubs При выполнении сопоставлений все помеченные подвыражения (expr) обрабатываются как непомеченные подвыражения (?:expr). Сопоставления не сохраняются в предоставленной структуре std::regex_match и значение mark_count() равно нулю.
optimize Указывает движку регулярных выражений на ускорение процесса сопоставления, потенциально замедлив процесс построения. Например, это может означать преобразование недетерминированного конечного автомата в детерминированный.
collate Диапазоны символов вида "[a-b]" будут чувствительны к локальным настройкам.
multiline (C++17) Указывает, что ^ должно соответствовать началу строки, а $ должно соответствовать концу строки, если выбран движок ECMAScript.
ECMAScript Использовать изменённую грамматику регулярных выражений ECMAScript.
basic Использовать базовую грамматику регулярных выражений POSIX (документация грамматики).
extended Использовать расширенную грамматику регулярных выражений POSIX (документация грамматики).
awk Использовать грамматику регулярных выражений, используемую утилитой awk в POSIX (документация грамматики).
grep Использовать грамматику регулярных выражений, используемую утилитой grep в POSIX. Это фактически то же самое, что и опция basic, с добавлением символа новой строки '\n' в качестве разделителя альтернатив.
egrep Использовать грамматику регулярных выражений, используемую утилитой grep с опцией -E в POSIX. Это фактически то же самое, что и опция extended, с добавлением символа новой строки '\n' в качестве разделителя альтернатив, помимо '|'.

Должна быть выбрана не более одной опции грамматики из 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 Применено к Поведение, как опубликовано Корректное поведение
LWG 2053 C++11 константы были объявлены static удалён спецификатор static

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/regex/syntax_option_type

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API