класс cmatch m регулярные выражения с++ расскажи п...
बनाया गया: 16 मार्च 2025
बनाया गया: 16 मार्च 2025
класс cmatch m регулярные выражения с++ расскажи про это ещё про квантификаторы и раблту с итераторами
В C++11 появилась стандартная библиотека для работы с регулярными выражениями, которая объявлена в заголовке <regex>
. Рассмотрим ключевые моменты, связанные с классом cmatch, квантификаторами и работой с итераторами.
cmatch – это специальный тип результата сопоставления (matching result) для работы с C-строками (массивами символов типа const char*
). Он является синонимом match_results<const char*>
.
При использовании функций std::regex_match
или std::regex_search
можно передавать C-строки, а результат сохранять в объекте типа cmatch.
Объект cmatch позволяет получить доступ к найденным подстрокам (группам) через операторы индексирования. Например, result[0]
содержит всю найденную подстроку, а result[1]
, result[2]
и т.д. — соответствующие захватывающие группы.
Пример использования:
cpp#include <iostream> #include <regex> int main() { const char* text = "abc123"; std::regex pattern("([a-z]+)([0-9]+)"); std::cmatch result; if (std::regex_match(text, result, pattern)) { std::cout << "Найдено: " << result[0] << std::endl; std::cout << "Буквенная часть: " << result[1] << std::endl; std::cout << "Числовая часть: " << result[2] << std::endl; } return 0; }
Квантификаторы позволяют указать, сколько раз должен повторяться шаблон:
*
– соответствует предыдущему элементу 0 или более раз.a*
соответствует "", "a", "aa", "aaa" и т.д.+
– соответствует предыдущему элементу 1 или более раз.a+
соответствует "a", "aa", "aaa" и т.д.?
– соответствует предыдущему элементу 0 или 1 раз (делает его необязательным).a?
соответствует "", "a".{n}
– точно n повторений элемента.a{3}
соответствует "aaa".{n,}
– n и более повторений элемента.a{2,}
соответствует "aa", "aaa", "aaaa" и т.д.{n,m}
– от n до m повторений элемента.a{1,3}
соответствует "a", "aa", "aaa".Квантификаторы можно применять как к одиночным символам, так и к группам, заключенным в скобки. Они позволяют гибко описывать паттерны поиска.
Стандартная библиотека C++ предоставляет два типа итераторов для работы с регулярными выражениями:
std::regex_iterator
Этот итератор используется для поиска всех вхождений шаблона в строке. Он позволяет перебирать последовательность результатов, где каждый результат — это объект типа match_results
.
Пример:
cpp#include <iostream> #include <regex> #include <string> int main() { std::string text = "One 1, Two 2, Three 3"; std::regex pattern("(\\d+)"); auto begin = std::sregex_iterator(text.begin(), text.end(), pattern); auto end = std::sregex_iterator(); for (auto it = begin; it != end; ++it) { std::smatch match = *it; std::cout << "Найдено число: " << match.str() << std::endl; } return 0; }
std::regex_token_iterator
Этот итератор позволяет более тонко управлять тем, какие части найденного текста включать в результаты. Он может использоваться для разделения строки на токены по заданному шаблону или для извлечения конкретных подмасок.
Пример:
cpp#include <iostream> #include <regex> #include <string> int main() { std::string text = "One 1, Two 2, Three 3"; std::regex pattern("(\\d+)"); // Извлекаем только первую захватывающую группу (номер) std::regex_token_iterator<std::string::iterator> tokenIt(text.begin(), text.end(), pattern, 1); std::regex_token_iterator<std::string::iterator> tokenEnd; for (; tokenIt != tokenEnd; ++tokenIt) { std::cout << "Найдено число: " << *tokenIt << std::endl; } return 0; }
*
, +
, ?
, {n}
, {n,}
, {n,m}
) позволяют задавать требуемое число повторений шаблона.std::regex_iterator
и std::regex_token_iterator
) помогают перебирать все вхождения шаблона в строке или извлекать определенные подмаски.Эти инструменты делают работу с регулярными выражениями в C++ гибкой и мощной, позволяя обрабатывать строки, находить совпадения и манипулировать текстом с минимальными усилиями.