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<constchar*>
std::wcregex_token_iterator std::regex_token_iterator<constwchar_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 constvalue_type*
reference constvalue_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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
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/cpp/regex/regex_token_iterator

Spec-Zone.ru

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