класс 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++ гибкой и мощной, позволяя обрабатывать строки, находить совпадения и манипулировать текстом с минимальными усилиями.