std::regex_iterator
Определён в заголовочном файле <regex> | ||
|---|---|---|
template<
class BidirIt,
class CharT = typename std::iterator_traits<BidirIt>::value_type,
class Traits = std::regex_traits<CharT>
> class regex_iterator
| (начиная с C++11) |
std::regex_iterator — это итератор только для чтения, который обращается к отдельным совпадениям регулярного выражения в базовой последовательности символов. Он соответствует требованиям LegacyForwardIterator, за исключением того, что для разыменовываемых значений a и b с a == b объекты, на которые ссылаются *a и *b, не будут одним и тем же объектом.
При конструировании и при каждом увеличении итератор вызывает std::regex_search и сохраняет результат (то есть копию значения std::match_results<BidirIt>). Первый объект может быть прочитан при конструировании итератора или при первом разыменовании. В противном случае разыменование лишь возвращает копию последнего найденного совпадения регулярного выражения.
Итератор std::regex_iterator, сконструированный по умолчанию, является итератором конца последовательности. Когда допустимый std::regex_iterator увеличивается после достижения последнего совпадения (std::regex_search возвращает false), он становится равен итератору конца последовательности. Дальнейшее разыменование или увеличение приводит к неопределённому поведению.
Типичная реализация std::regex_iterator хранит итераторы начала и конца базовой последовательности (два экземпляра BidirIt), указатель на регулярное выражение (constregex_type*), флаги совпадения (std::regex_constants::match_flag_type) и текущее совпадение (std::match_results<BidirIt>).
Требования к типам
-BidirIt должен соответствовать требованиям LegacyBidirectionalIterator. |
Специализации
Определено несколько специализаций для распространённых типов последовательностей символов:
Определено в заголовочном файле <regex> |
|
|---|---|
| Тип | Определение |
std::cregex_iterator | std::regex_iterator<constchar*> |
std::wcregex_iterator | std::regex_iterator<constwchar_t*> |
std::sregex_iterator | std::regex_iterator<std::string::const_iterator> |
std::wsregex_iterator | std::regex_iterator<std::wstring::const_iterator> |
Типы-члены
| Тип | Определение |
|---|---|
value_type | std::match_results<BidirIt> |
difference_type |
std::ptrdiff_t |
pointer | constvalue_type* |
reference | constvalue_type& |
iterator_category |
std::forward_iterator_tag |
iterator_concept (C++20) |
std::input_iterator_tag |
regex_type | std::basic_regex<CharT,Traits> |
Члены-данные
| Член | Описание |
|---|---|
BidiIt begin (закрытый) | итератор начала (член-объект только для описания) |
BidiIt end (закрытый) | итератор конца (член-объект только для описания) |
constregex_type* pregex (закрытый) | указатель на регулярное выражение (член-объект только для описания) |
regex_constants::match_flag_type flags (закрытый) | флаг (член-объект только для описания) |
match_results<BidiIt> match (закрытый) | текущее совпадение (член-объект только для описания) |
Функции-члены
создаёт новый regex_iterator (открытая функция-член) |
|
|
(деструктор)
(объявлен неявно) | уничтожает regex_iterator вместе с кэшированным значением (открытая функция-член) |
| присваивает содержимое (открытая функция-член) |
|
|
(удалены в C++20) | сравнивает два regex_iteratorа (открытая функция-член) |
| обращается к текущему совпадению (открытая функция-член) |
|
| перемещает итератор к следующему совпадению (открытая функция-член) |
Примечания
Программист несёт ответственность за то, чтобы объект std::basic_regex, переданный конструктору итератора, существовал дольше итератора. Поскольку итератор хранит указатель на регулярное выражение, увеличение итератора после уничтожения регулярного выражения приводит к обращению к висячему указателю.
Если совпавшая часть регулярного выражения является лишь утверждением (^, $, \b, \B), совпадение, хранящееся в итераторе, имеет нулевую длину, то есть match[0].first == match[0].second.
Пример
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
const std::string s = "Quick brown fox.";
std::regex words_regex("[^\\s]+");
auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
auto words_end = std::sregex_iterator();
std::cout << "Found " << std::distance(words_begin, words_end) << " words:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i)
{
std::smatch match = *i;
std::string match_str = match.str();
std::cout << match_str << '\n';
}
}
Вывод:
Found 3 words: Quick brown fox.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
LWG 3698 (P2770R0) | C++20 |
regex_iterator был forward_iteratorпри этом являясь итератором с сохранением значения | стал input_iterator[1] |
-
iterator_categoryне изменился в результате принятого решения, поскольку его изменение наstd::input_iterator_tagмогло бы нарушить работу слишком большого количества существующего кода.
См. также
|
(C++11) | описывает одно совпадение регулярного выражения, включая совпадения всех подвыражений (шаблон класса) |
|
(C++11) | пытается сопоставить регулярное выражение с любой частью последовательности символов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/regex/regex_iterator