Spec-Zone.ru › C++

std::regex_constants::syntax_option_type

Определён в заголовочном файле <regex>
using syntax_option_type = /* implementation-defined */;
(1) (начиная с 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) (начиная с C++11)
(встроенная функция начиная с C++17)
inline constexpr syntax_option_type multiline = /* unspecified */;
(3) (начиная с C++17)
1) syntax_option_type — это тип битовой маски, содержащий параметры, определяющие поведение регулярных выражений.
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 Предписывает движку регулярных выражений ускорить сопоставление, потенциально замедлив построение. Например, это может означать преобразование недетерминированного конечного автомата (FSA) в детерминированный конечный автомат.
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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
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/cpp/regex/syntax_option_type

Spec-Zone.ru

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