Namespaces
Variants

std:: regex_token_iterator

From ru.cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_token_iterator
(C++11)
Exceptions
Traits
Constants
(C++11)
Regex Grammar
Определено в заголовочном файле <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
(public member function)
(destructor)
(implicitly declared)
уничтожает regex_token_iterator , включая кэшированное значение
(public member function)
присваивает содержимое
(public member function)
(removed in C++20)
сравнивает два regex_token_iterator а
(public member function)
получает доступ к текущей подсовпадению
(public member function)
перемещает итератор к следующей подсовпадению
(public member function)

Примечания

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

Пример

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
int main()
{
    // Токенизация (несовпадающие фрагменты)
    // Обратите внимание, что регулярное выражение совпадает только два раза; когда получается третье значение
    // итератор становится суффиксным итератором.
    const std::string text = "Quick brown fox.";
    const std::regex ws_re("\\s+"); // пробельные символы
    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';
    // Итерация по первым подсовпадениям
    const std::string html = R"(<p><a href="http://google.com">google</a> )"
                             R"(< a HREF ="http:https://ru.cppreference.net">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
https://ru.cppreference.net

Отчеты о дефектах

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

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