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) |
syntax_option_type — это тип битовой маски, содержащий параметры, определяющие поведение регулярных выражений.Константы
| Параметр грамматики | Эффект(ы) |
|---|---|
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 удалён |
См. также
|
(C++11) | объект регулярного выражения (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/regex/syntax_option_type