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) |
syntax_option_type представляет собой BitmaskType, содержащую опции, определяющие поведение регулярных выражений.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 |
См. также
|
(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