Класс regex_token_iterator
Класс regex_token_iterator представляет собой итератор,
который используется для перебора токенов строки. Токенами могут
быть как части строки, разделённые регулярным выражением, так и
сами совпадения или их отдельные подсовпадения. В первом параметре
конструктора мы передаём начало строки, во втором - конец строки,
в третьем - объект regex с регулярным выражением, а в
четвёртом - целое число или вектор целых чисел, указывающих, какие
именно части совпадения следует извлекать. Значение -1
означает, что нужно вернуть часть строки между совпадениями.
Класс часто применяется вместе с алгоритмами стандартной
библиотеки, например copy, для разбиения строки на
токены или для извлечения всех совпадений и подсовпадений.
Синтаксис
regex_token_iterator<BidirectionalIterator> it(begin, end, re, submatch);
regex_token_iterator<BidirectionalIterator> end;
Пример
Давайте разобьём строку "abcde" на токены с помощью
регулярного выражения, которое ищет символ 'c'.
Для этого передадим в качестве четвёртого параметра значение
-1:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "abcde";
regex re("c");
sregex_token_iterator it(str.begin(), str.end(), re, -1);
sregex_token_iterator end;
for (; it != end; ++it)
{
cout << *it << endl;
}
return 0;
}
Результат выполнения кода:
"ab"
"de"
Пример
Давайте теперь извлечём все совпадения регулярного выражения,
которое ищет цифры в строке "12345". Для этого передадим
в качестве четвёртого параметра значение 0:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main()
{
string str = "12345";
regex re("\\d");
sregex_token_iterator it(str.begin(), str.end(), re, 0);
sregex_token_iterator end;
for (; it != end; ++it)
{
cout << *it << endl;
}
return 0;
}
Результат выполнения кода:
1
2
3
4
5
Пример
Давайте извлечём отдельные подсовпадения. Создадим регулярное
выражение с двумя группами и передадим вектор {1, 2},
чтобы получить содержимое первой и второй групп:
#include <iostream>
#include <regex>
#include <string>
#include <vector>
using namespace std;
int main()
{
string str = "abcde";
regex re("(a)(b)");
vector<int> submatches = {1, 2};
sregex_token_iterator it(str.begin(), str.end(), re, submatches);
sregex_token_iterator end;
for (; it != end; ++it)
{
cout << *it << endl;
}
return 0;
}
Результат выполнения кода:
"a"
"b"
Смотрите также
-
класс
regex,
который представляет регулярное выражение -
класс
regex_iterator,
который перебирает совпадения регулярного выражения -
функция
regex_search,
которая ищет первое совпадение в строке -
функция
regex_replace,
которая заменяет совпадения в строке