Библиотека регулярных выражений (начиная с C++11)
Библиотека регулярных выражений предоставляет класс, представляющий регулярные выражения, которые являются своего рода мини-языком, используемым для выполнения сопоставления с образцом в строках. Почти все операции с регулярными выражениями могут быть осуществлены посредством следующих объектов:
- Целевая последовательность. Последовательность символов, в которой выполняется поиск шаблона. Это может быть диапазон, заданный двумя итераторами, символьная строка с завершающим нулём или std::string.
- Шаблон. Это само регулярное выражение. Оно определяет, что составляет соответствие. Это объект типа std::basic_regex, созданный из строки со специальным синтаксисом. Смотрите std::regex_constants::syntax_option_type для описания поддерживаемых вариантов синтаксиса.
- Массив совпадений. Информация о совпадениях может быть получена как объект типа std::match_results.
- Строка замены. Это строка, которая определяет, как заменить совпадения, std::regex_constants::match_flag_type для описания поддерживаемых вариантов синтаксиса.
Основные классы
Эти классы инкапсулируют регулярное выражение и результаты сопоставления регулярного выражения в целевой последовательности символов.
(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 <string>
#include <regex>
int main()
{
std::string s = "Некоторые люди, столкнувшись с проблемой, думают: "
"\"Я знаю, я буду использовать регулярные выражения.\" "
"Теперь у них есть две проблемы.";
std::regex self_regex("РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ",
std::regex_constants::ECMAScript | std::regex_constants::icase);
if (std::regex_search(s, self_regex)) {
std::cout << "Текст содержащий фразу 'регулярные выражения'\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 << "Найдено "
<< std::distance(words_begin, words_end)
<< " слов\n";
const int N = 6;
std::cout << "Слова длиннее " << N << " символов:\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';
}
Вывод:
Текст содержащий фразу 'регулярные выражения'
Найдено 19 слов
Слова длиннее 6 символов:
Некоторые
столкнувшись
проблемой
использовать
регулярные
выражения
проблемы
[Некоторые] люди, [столкнувшись] с [проблемой], думают:
"Я знаю, я буду [использовать] [регулярные] [выражения]."
Теперь у них есть две [проблемы].