Шаблон класса regex_iterator - это адаптер итератора. Он представляет новое представление существующей последовательности итератора, перечисляя все вхождения регулярного выражения в этой последовательности. A regex_iterator использует regex_search для поиска последовательных совпадений регулярных выражений в последовательности, из которой оно было построено. После того, как итератор построен и каждый раз operator++ используется, итератор находит и сохраняет значение match_results<BidirectionalIterator>. Если достигается конец последовательности (regex_search возвращается false), итератор становится равным значению итератора конца последовательности. Конструктор по умолчанию создает объект-итератор конца последовательности, который является единственным допустимым итератором, который можно использовать для конечного условия. Результат для operator* итератора конца последовательности не определен. Для любого другого значения итератораmatch_results<BidirectionalIterator>& возвращается константа . Результат для operator-> итератора конца последовательности не определен. Для любого другого итератора const match_results<BidirectionalIterator>* возвращается значение a . Нельзя хранить вещи в regex_iterators. Два итератора конца последовательности всегда равны. Итератор конца последовательности не равен итератору конца последовательности. Два итератора без конца последовательности равны, если они построены из одних и тех же аргументов.
namespace std { template <class BidirectionalIterator, class charT = typename iterator_traits<BidirectionalIterator>::value_type, class traits = regex_traits<charT>> class regex_iterator { public: using regex_type = basic_regex<charT, traits>; using iterator_category = forward_iterator_tag; using value_type = match_results<BidirectionalIterator>; using difference_type = ptrdiff_t; using pointer = const value_type*; using reference = const value_type&; regex_iterator(); regex_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, regex_constants::match_flag_type m = regex_constants::match_default); regex_iterator(BidirectionalIterator, BidirectionalIterator, const regex_type&&, regex_constants::match_flag_type = regex_constants::match_default) = delete; regex_iterator(const regex_iterator&); regex_iterator& operator=(const regex_iterator&); bool operator==(const regex_iterator&) const; bool operator!=(const regex_iterator&) const; const value_type& operator*() const; const value_type* operator->() const; regex_iterator& operator++(); regex_iterator operator++(int); private: BidirectionalIterator begin; // exposition only BidirectionalIterator end; // exposition only const regex_type* pregex; // exposition only regex_constants::match_flag_type flags; // exposition only match_results<BidirectionalIterator> match; // exposition only }; }
Объект типа, regex_iterator который не является итератором конца последовательности, содержит zero-length match if match[0].matched == true и
match[0].first == match[0].second. [ Note: Например, это может произойти , когда часть регулярного выражения , которые соответствовали состоит только из утверждения (например '^'
, '$'
,
'\b', '\B'). ] — end note
regex_iterator();
regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
regex_constants::match_flag_type m = regex_constants::match_default);
bool operator==(const regex_iterator& right) const;
bool operator!=(const regex_iterator& right) const;
const value_type& operator*() const;
const value_type* operator->() const;
regex_iterator& operator++();
Effects: Создает локальную переменную start типа BidirectionalIterator и инициализирует ее значением match[0].second.
Если итератор содержит совпадение нулевой длины, а start == end оператор устанавливает *this итератор конца последовательности и возвращается *this.
В противном случае, если итератор содержит совпадение нулевой длины, оператор вызывает:
regex_search(start, end, match, *pregex, flags | regex_constants::match_not_null | regex_constants::match_continuous)
Если вызов вернул, true оператор вернется *this. В противном случае оператор увеличивает start и продолжает работу, как если бы последнее совпадение не было совпадением нулевой длины.
Если самый последний матч не был матч нулевой длины, оператор устанавливает flags на flags | regex_constants::match_prev_avail и вызовы regex_search(start, end, match, *pregex, flags). Если вызов возвращает false набор итераторов в итератор *this конца последовательности. Затем итератор возвращается *this.
Во всех случаях, когда вызов regex_search возвращается true, match.prefix().first должно быть равно предыдущему значению match[0].second, и для каждого индекса i в полуоткрытом диапазоне, [0, match.size()) для которого match[i].matched есть true, match.position(i) должно возвращаться distance(begin, match[i].first).
[ Note: Это означает, что это match.position(i) дает смещение от начала целевой последовательности, которое часто не совпадает с смещением от последовательности, переданной в вызове regex_search. ] — end note
[ Note: Это означает, что компилятор может вызвать функцию поиска, зависящую от реализации, и в этом случае определенная пользователем специализация regex_search не будет вызываться. ] — end note
regex_iterator operator++(int);