Spec-Zone.ru › C++

std::regex_token_iterator

Определено в заголовке <regex>
template<
    class BidirIt,
    class CharT = typename std::iterator_traits<BidirIt>::value_type,
    class Traits = std::regex_traits<CharT>
> class regex_token_iterator
(с C++11)

std::regex_token_iterator является только для чтения LegacyForwardIterator, который обращается к отдельным подсовпадениям каждого совпадения регулярного выражения в базовой последовательности символов. Он также может использоваться для доступа к частям последовательности, которые не были сопоставлены данным регулярным выражением (например, в качестве токенизатора).

При создании он создаёт std::regex_iterator, а при каждом инкременте он переходит к запрашиваемым подсовпадениям из текущего match_results, увеличивая базовый std::regex_iterator при перемещении от последнего подсовпадения.

Созданный по умолчанию std::regex_token_iterator — это итератор конца последовательности. Когда действительный std::regex_token_iterator инкрементируется после достижения последнего подсовпадения последнего совпадения, он становится равным итератору конца последовательности. Обращение к нему или дальнейшее инкрементирование вызовет неопределённое поведение.

Непосредственно перед тем, как стать итератором конца последовательности, std::regex_token_iterator может стать итератором суффикса, если индекс -1 (фрагмент, не сопоставленный выражением) появляется в списке запрашиваемых индексов подсовпадений. Такой итератор, если к нему обратиться, возвращает match_results, соответствующие последовательности символов между последним совпадением и концом последовательности.

Типичная реализация std::regex_token_iterator содержит базовый std::regex_iterator, контейнер (например, std::vector<int>) запрашиваемых индексов подсовпадений, внутренний счётчик, равный индексу подсовпадения, указатель на std::sub_match, указывающий на текущее подсовпадение текущего совпадения, и объект std::match_results, содержащий последнюю несопоставленную последовательность символов (используется в режиме токенизации).

Требования к типам

-BidirIt должен соответствовать требованиям LegacyBidirectionalIterator.

Специализации

Определены несколько специализаций для распространённых типов последовательностей символов:

Определено в заголовке <regex>
Тип Определение
std::cregex_token_iterator std::regex_token_iterator<const char*>
std::wcregex_token_iterator std::regex_token_iterator<const wchar_t*>
std::sregex_token_iterator std::regex_token_iterator<std::string::const_iterator>
std::wsregex_token_iterator std::regex_token_iterator<std::wstring::const_iterator>

Типы-члены

Тип-член Определение
value_type std::sub_match<BidirIt>
difference_type std::ptrdiff_t
pointer const value_type*
reference const value_type&
iterator_category std::forward_iterator_tag
iterator_concept (C++20) std::input_iterator_tag
regex_type std::basic_regex<CharT, Traits>

Члены-функции

(конструктор)
создаёт новый regex_token_iterator
(публичная функция-член)
(деструктор)
(явное объявление)
удаляет regex_token_iterator, включая кэшированное значение
(публичная функция-член)
operator=
присваивает содержимое
(публичная функция-член)
operator==operator!=
(удалено в C++20)
сравнивает два regex_token_iterator
(публичная функция-член)
operator*operator->
обращается к текущему подсовпадению
(публичная функция-член)
operator++operator++(int)
перемещает итератор к следующему подсовпадению
(публичная функция-член)

Примечания

Программа должна гарантировать, что объект std::basic_regex, переданный в конструктор итератора, существует дольше, чем сам итератор. Поскольку итератор хранит std::regex_iterator, который хранит указатель на регулярное выражение, инкрементирование итератора после удаления регулярного выражения приводит к неопределённому поведению.

Пример

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
 
int main()
{
    // Tokenization (non-matched fragments)
    // Note that regex is matched only two times; when the third value is obtained
    // the iterator is a suffix iterator.
    const std::string text = "Quick brown fox.";
    const std::regex ws_re("\\s+"); // whitespace
    std::copy(std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
 
    std::cout << '\n';
 
    // Iterating the first submatches
    const std::string html = R"(<p><a href="http://google.com">google</a> )"
                             R"(< a HREF ="http://cppreference.com">cppreference</a>\n</p>)";
    const std::regex url_re(R"!!(<\s*A\s+[^>]*href\s*=\s*"([^"]*)")!!", std::regex::icase);
    std::copy(std::sregex_token_iterator(html.begin(), html.end(), url_re, 1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

Вывод:

Quick
brown
fox.
 
http://google.com
http://cppreference.com

Отчёты об ошибках

Следующие исправляющие поведение отчёты об ошибках были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Корректное поведение
LWG 3698
(P2770R0)
C++20 regex_token_iterator был forward_iterator
при этом являясь итератором-хранилищем
сделал input_iterator[1]
  1. iterator_category не изменилось в результате решения, так как изменение его на std::input_iterator_tag может сломать слишком много существующего кода.

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/regex/regex_token_iterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API