Шаблон классаregex_token_iterator - это адаптер итератора; то есть он представляет новое представление существующей последовательности итератора, перечисляя все вхождения регулярного выражения в этой последовательности и представляя одно или несколько подвыражений для каждого найденного совпадения. Каждая позиция, перечисляемая итератором, являетсяsub_match экземпляром шаблона класса, который представляет то, что соответствует определенному подвыражению в регулярном выражении.
Когда классregex_token_iterator используется для перечисления одного подвыражения с индексом -1, итератор выполняет разделение полей: то есть перечисляет одно подвыражение для каждого раздела последовательности контейнера символов, которое не соответствует указанному регулярному выражению.
После создания итератор находит и сохраняет значение regex_iterator<BidirectionalIterator> position и устанавливает внутренний счетчикN на ноль. Он также поддерживает последовательность, subs которая содержит список подвыражений, которые будут перечислены. Каждый раз приoperator++ использовании счетчикN увеличивается; еслиN больше или равноsubs.size(), то итератор увеличивает членposition и устанавливает значение countN в ноль.
Если достигается конец последовательности (position равен концу итератора последовательности), итератор становится равным значению итератора конца последовательности, если только перечисляемое подвыражение не имеет индекса -1, и в этом случае итератор перечисляет одно последнее подвыражение, которое содержит все символы от конца последнего совпадения регулярного выражения до конца перечисляемой входной последовательности, при условии, что это не будет пустым подвыражением.
Конструктор по умолчанию создает объект-итератор конца последовательности, который является единственным допустимым итератором, который можно использовать для конечного условия. Результат дляoperator* итератора конца последовательности не определен. Для любого другого итератораconst sub_match<BidirectionalIterator>& возвращается значение a . Результат дляoperator-> итератора конца последовательности не определен. Для любого другого итератораconst sub_match<BidirectionalIterator>* возвращается значение a .
Нельзя хранить вещи вregex_token_iterators. Два итератора конца последовательности всегда равны. Итератор конца последовательности не равен итератору конца последовательности. Два итератора без конца последовательности равны, если они построены из одних и тех же аргументов.
namespace std { template <class BidirectionalIterator, class charT = typename iterator_traits<BidirectionalIterator>::value_type, class traits = regex_traits<charT>> class regex_token_iterator { public: using regex_type = basic_regex<charT, traits>; using iterator_category = forward_iterator_tag; using value_type = sub_match<BidirectionalIterator>; using difference_type = ptrdiff_t; using pointer = const value_type*; using reference = const value_type&; regex_token_iterator(); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, const vector<int>& submatches, regex_constants::match_flag_type m = regex_constants::match_default); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, initializer_list<int> submatches, regex_constants::match_flag_type m = regex_constants::match_default); template <size_t N> regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, const int (&submatches)[N], regex_constants::match_flag_type m = regex_constants::match_default); regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default) = delete; regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, const vector<int>& submatches, regex_constants::match_flag_type m = regex_constants::match_default) = delete; regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, initializer_list<int> submatches, regex_constants::match_flag_type m = regex_constants::match_default) = delete; template <size_t N> regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type&& re, const int (&submatches)[N], regex_constants::match_flag_type m = regex_constants::match_default) = delete; regex_token_iterator(const regex_token_iterator&); regex_token_iterator& operator=(const regex_token_iterator&); bool operator==(const regex_token_iterator&) const; bool operator!=(const regex_token_iterator&) const; const value_type& operator*() const; const value_type* operator->() const; regex_token_iterator& operator++(); regex_token_iterator operator++(int); private: using position_iterator = regex_iterator<BidirectionalIterator, charT, traits>; // exposition only position_iterator position; // exposition only const value_type* result; // exposition only value_type suffix; // exposition only size_t N; // exposition only vector<int> subs; // exposition only }; }
Asuffix iterator - этоregex_token_iterator объект, который указывает на последнюю последовательность символов в конце целевой последовательности. В качестве суффикса итератора элементаresult содержит указатель к элементу данныхsuffix, значение элементаsuffix.match являетсяtrue,suffix.first указывает на начало конечной последовательности, а такжеsuffix.second указывает на конец конечной последовательности.
[ Note: Для суффиксного итератора элемент данныхsuffix.first совпадает с концом последнего найденного совпадения иsuffix.second совпадает с концом целевой последовательности ] — end note
current match Является ,(*position).prefix() еслиsubs[N] == -1, или (*position)[subs[N]] для любого другого значенияsubs[N].
regex_token_iterator();
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
int submatch = 0,
regex_constants::match_flag_type m = regex_constants::match_default);
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
const vector<int>& submatches,
regex_constants::match_flag_type m = regex_constants::match_default);
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
initializer_list<int> submatches,
regex_constants::match_flag_type m = regex_constants::match_default);
template <size_t N>
regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
const regex_type& re,
const int (&submatches)[N],
regex_constants::match_flag_type m = regex_constants::match_default);
Effects: Первый конструктор инициализирует членsubs для хранения единственного значенияsubmatch. Второй конструктор инициализирует членsubs для хранения копии аргументаsubmatches. Третий и четвертый конструкторы инициализируют членsubs для хранения копии последовательности целочисленных значений, на которые указывает диапазон итератора[submatches.begin(), submatches.end()) и [&submatches, &submatches + N), соответственно.
Затем каждый конструктор устанавливаетN значение 0 иposition значение position_iterator(a, b, re, m). Еслиposition это не итератор конца последовательности, конструктор устанавливаетresult адрес текущего совпадения. В противном случае, если любое из значений, хранящихся вsubs , равно -1, конструктор устанавливает*this итератор суффикса, который указывает на диапазон[a, b), в противном случае конструктор устанавливает*this итератор конца последовательности.
bool operator==(const regex_token_iterator& right) const;
Returns:true if*this иright оба являются итераторами конца последовательности, или if*this иright являются суффиксными итераторами иsuffix == right.suffix; в противном случае возвращает,false если*this илиright является итератором конца последовательности, или суффиксным итератором. В противном случае возвращаетсяtrue еслиposition == right.position, N == right.Nиsubs == right.subs. В противном случае возвращаетсяfalse.
bool operator!=(const regex_token_iterator& right) const;
const value_type& operator*() const;
const value_type* operator->() const;
regex_token_iterator& operator++();
Effects: Создает локальную переменнуюprev типаposition_iterator, инициализированную значениемposition.
В противном случае, еслиN + 1 < subs.size(), увеличиваетсяN и устанавливаетсяresult на адрес текущего совпадения.
В противном случае устанавливаетсяN в 0 и увеличиваетсяposition. Еслиposition это не итератор конца последовательности, оператор устанавливаетresult адрес текущего совпадения.
В противном случае, если какое-либо из значений, хранящихся вsubs , равно -1, а prev->suffix().length() не 0, оператор устанавливает*this итератор суффикса, который указывает на диапазон[prev->suffix().first, prev->suffix().second).
regex_token_iterator& operator++(int);