Regular expressions library (since C++11)
Библиотека регулярных выражений предоставляет класс, представляющий регулярные выражения , которые представляют собой мини-язык для выполнения сопоставления с образцом в строках. Почти все операции с regex можно охарактеризовать работой со следующими объектами:
- Целевая последовательность . Символьная последовательность, в которой выполняется поиск шаблона. Это может быть диапазон, заданный двумя итераторами, строка символов с нулевым завершением или 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)
|
выполняет итерацию по всем совпадениям регулярного выражения в последовательности символов
(class template) |
|
(C++11)
|
выполняет итерацию по указанным подвыражениям во всех совпадениях регулярного выражения в заданной строке или по неподходящим подстрокам
(class template) |
Исключения
Этот класс определяет тип объектов, выбрасываемых в качестве исключений для сообщения об ошибках из библиотеки регулярных выражений.
|
(C++11)
|
сообщает об ошибках, генерируемых библиотекой регулярных выражений
(класс) |
Трейты
Класс характеристик регулярных выражений используется для инкапсуляции локализуемых аспектов регулярного выражения.
|
(C++11)
|
предоставляет метаинформацию о типе символов, требуемую библиотекой регулярных выражений
(шаблон класса) |
Константы
|
Определено в пространстве имен
std::regex_constants
|
|
|
(C++11)
|
общие опции, управляющие поведением регулярных выражений
(typedef) |
|
(C++11)
|
опции, специфичные для сопоставления
(typedef) |
|
(C++11)
|
описывает различные типы ошибок сопоставления
(typedef) |
Пример
#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].