Класс regex_iterator
Класс regex_iterator представляет собой итератор,
который последовательно перебирает все совпадения
регулярного выражения в строке. При разыменовании
итератор возвращает объект match_results,
содержащий информацию о текущем совпадении: полное
совпадение и все захваченные подгруппы. Первым
параметром конструктор принимает итератор начала
строки, вторым - итератор конца строки, а третьим -
объект regex с искомым шаблоном. Для обозначения
конца перебора используется специальный "конечный"
итератор, который создается конструктором по
умолчанию.
Итератор regex_iterator полезен, когда нужно
обработать все совпадения в строке, а не только
первое. Например, с его помощью можно извлечь все
числа из текста или все слова, соответствующие
заданному шаблону.
Синтаксис
regex_iterator<BidirIt, CharT, Traits>
// Создание итератора начала перебора:
regex_iterator<BidirIt, CharT, Traits> it(begin, end, re);
// Создание конечного итератора:
regex_iterator<BidirIt, CharT, Traits> end;
Здесь begin и end - итераторы начала
и конца обрабатываемой последовательности символов,
а re - объект regex с шаблоном поиска.
Пример
Давайте найдем все числа в строке "abc 123 de 45 fg 6"
и выведем их на экран:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "abc 123 de 45 fg 6";
regex re("\\d+");
regex_iterator<string::iterator> it(str.begin(), str.end(), re);
regex_iterator<string::iterator> end;
for (; it != end; ++it)
{
cout << it->str() << endl;
}
return 0;
}
Результат выполнения кода:
123
45
6
Пример
Давайте найдем все слова, состоящие из двух букв,
в строке "ab cd efg hi jk" и выведем каждое
совпадение вместе с его позицией:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "ab cd efg hi jk";
regex re("[a-z]{2}");
regex_iterator<string::iterator> it(str.begin(), str.end(), re);
regex_iterator<string::iterator> end;
for (; it != end; ++it)
{
cout << it->str() << " at " << it->position() << endl;
}
return 0;
}
Результат выполнения кода:
""ab" at 0"
""cd" at 3"
""hi" at 10"
""jk" at 13"
Пример
Давайте извлечем все подгруппы из строки
"2024-01-15", соответствующей шаблону даты:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "2024-01-15";
regex re("(\\d{4})-(\\d{2})-(\\d{2})");
regex_iterator<string::iterator> it(str.begin(), str.end(), re);
regex_iterator<string::iterator> end;
for (; it != end; ++it)
{
cout << "Year: " << (*it)[1].str() << endl;
cout << "Month: " << (*it)[2].str() << endl;
cout << "Day: " << (*it)[3].str() << endl;
}
return 0;
}
Результат выполнения кода:
"Year: 2024"
"Month: 01"
"Day: 15"
Смотрите также
-
класс
regex,
который представляет регулярное выражение -
функция
regex_search,
которая ищет первое совпадение в строке -
класс
cmatch,
который хранит результаты совпадения для C-строк -
класс
regex_token_iterator,
который перебирает отдельные части совпадений