Библиотека регулярных выражений (начиная с C++11)
Библиотека регулярных выражений предоставляет класс, представляющий регулярные выражения — разновидность мини-языка, используемого для поиска соответствий шаблону в строках. Почти все операции с регулярными выражениями можно описать с помощью нескольких следующих объектов:
-
Целевая последовательность. Последовательность символов, в которой выполняется поиск по шаблону. Это может быть диапазон, заданный двумя итераторами, строка символов с нулевым завершающим символом или
std::string. -
Шаблон. Само регулярное выражение. Оно определяет, что считается совпадением. Это объект типа
std::basic_regex, созданный из строки с использованием специальной грамматики. -
Массив совпадений. Сведения о совпадениях можно получить в виде объекта типа
std::match_results. - Строка замены. Строка, определяющая, как заменять совпадения.
Грамматики регулярных выражений
Для шаблонов и строк замены поддерживаются следующие грамматики регулярных выражений:
- Изменённая грамматика регулярных выражений ECMAScript. Это грамматика по умолчанию.
- Базовая грамматика регулярных выражений POSIX.
- Расширенная грамматика регулярных выражений POSIX.
- Грамматика регулярных выражений, используемая утилитой
awkв POSIX. - Грамматика регулярных выражений, используемая утилитой
grepв POSIX. Она практически совпадает с базовой грамматикой регулярных выражений POSIX, но дополнительно использует символ новой строки'\n'в качестве разделителя альтернатив. - Грамматика регулярных выражений, используемая утилитой
grepс параметром-Eв POSIX. Она практически совпадает с расширенной грамматикой регулярных выражений POSIX, но дополнительно использует символ новой строки'\n'в качестве разделителя альтернатив наряду с'|'.
Также доступны некоторые варианты грамматик (например, поиск без учёта регистра). Подробности см. на этой странице.
Основные классы
Эти классы инкапсулируют регулярное выражение и результаты поиска соответствий регулярному выражению в целевой последовательности символов.
|
(C++11) | объект регулярного выражения (шаблон класса) |
|
(C++11) | определяет последовательность символов, соответствующую подвыражению (шаблон класса) |
|
(C++11) | определяет одно совпадение с регулярным выражением, включая все совпадения с подвыражениями (шаблон класса) |
Алгоритмы
Эти функции применяют регулярное выражение, инкапсулированное в regex, к целевой последовательности символов.
|
(C++11) | пытается сопоставить регулярное выражение со всей последовательностью символов (шаблон функции) |
|
(C++11) | пытается сопоставить регулярное выражение с любой частью последовательности символов (шаблон функции) |
|
(C++11) | заменяет совпадения с регулярным выражением форматированным текстом замены (шаблон функции) |
Итераторы
Итераторы регулярных выражений используются для обхода полного набора совпадений с регулярным выражением, найденных в последовательности.
|
(C++11) | перебирает все совпадения с регулярным выражением в последовательности символов (шаблон класса) |
|
(C++11) | перебирает указанные подвыражения во всех совпадениях с регулярным выражением в заданной строке или несовпавшие подстроки (шаблон класса) |
Исключения
Этот класс определяет тип объектов, выбрасываемых как исключения для сообщения об ошибках библиотеки регулярных выражений.
|
(C++11) | сообщает об ошибках, возникающих в библиотеке регулярных выражений (класс) |
Свойства
Класс свойств регулярных выражений используется для инкапсуляции локализуемых аспектов регулярного выражения.
|
(C++11) | предоставляет метаинформацию о типе символов, необходимую библиотеке регулярных выражений (шаблон класса) |
Константы
Определены в пространстве имён std::regex_constants |
|
|---|---|
|
(C++11) | общие параметры, управляющие поведением регулярных выражений (псевдоним типа) |
|
(C++11) | параметры, относящиеся к поиску совпадений (псевдоним типа) |
|
(C++11) | описывает различные типы ошибок поиска совпадений (псевдоним типа) |
Пример
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
std::string s = "Some people, when confronted with a problem, think "
"\"I know, I'll use regular expressions.\" "
"Now they have two problems.";
std::regex self_regex("REGULAR EXPRESSIONS",
std::regex_constants::ECMAScript | std::regex_constants::icase);
if (std::regex_search(s, self_regex))
std::cout << "Text contains the phrase 'regular expressions'\n";
std::regex word_regex("(\\w+)");
auto words_begin =
std::sregex_iterator(s.begin(), s.end(), word_regex);
auto words_end = std::sregex_iterator();
std::cout << "Found "
<< std::distance(words_begin, words_end)
<< " words\n";
const int N = 6;
std::cout << "Words longer than " << N << " characters:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i)
{
std::smatch match = *i;
std::string match_str = match.str();
if (match_str.size() > N)
std::cout << " " << match_str << '\n';
}
std::regex long_word_regex("(\\w{7,})");
std::string new_s = std::regex_replace(s, long_word_regex, "[$&]");
std::cout << new_s << '\n';
}
Вывод:
Text contains the phrase 'regular expressions' Found 20 words Words longer than 6 characters: confronted problem regular expressions problems Some people, when [confronted] with a [problem], think "I know, I'll use [regular] [expressions]." Now they have two [problems].
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/regex