Шаблон классаregex_iterator - это адаптер итератора. Он представляет новое представление существующей последовательности итератора, перечисляя все вхождения регулярного выражения в этой последовательности. Aregex_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 ifmatch[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);
Шаблон класса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);