31 Regular expressions library [re]

31.12 Regular expression iterators [re.iter]

31.12.2 Class template regex_­token_­iterator [re.tokiter]

Шаблон класса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].

31.12.2.1 regex_­token_­iterator constructors [re.tokiter.cnstr]

regex_token_iterator();

Effects: Создает итератор конца последовательности.

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);

Requires: Каждое из значений инициализацииsubmatches должно быть >= -1.

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 итератор конца последовательности.

31.12.2.2 regex_­token_­iterator comparisons [re.tokiter.comp]

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;

Returns:!(*this == right).

31.12.2.3 regex_­token_­iterator indirection [re.tokiter.deref]

const value_type& operator*() const;

Returns:*result.

const value_type* operator->() const;

Returns:result.

31.12.2.4 regex_­token_­iterator increment [re.tokiter.incr]

regex_token_iterator& operator++();

Effects: Создает локальную переменнуюprev типаposition_­iterator, инициализированную значениемposition.

Если*this - суффиксный итератор, устанавливает итератор*this конца последовательности.

В противном случае, еслиN + 1 < subs.size(), увеличиваетсяN и устанавливаетсяresult на адрес текущего совпадения.

В противном случае устанавливаетсяN в 0 и увеличиваетсяposition. Еслиposition это не итератор конца последовательности, оператор устанавливаетresult адрес текущего совпадения.

В противном случае, если какое-либо из значений, хранящихся вsubs , равно -1, а prev->suffix().length() не 0, оператор устанавливает*this итератор суффикса, который указывает на диапазон[prev->suffix().first, prev->suffix().second).

В противном случае устанавливается*this итератор конца последовательности.

Returns:*this

regex_token_iterator& operator++(int);

Effects: Создаёт копиюtmp из*this, а затем вызывает++(*this).

Returns:tmp.