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, включая кэшированное значение (публичная функция-член) |
| присваивает содержимое (публичная функция-член) |
|
|
(удалено в C++20) |
сравнивает два regex_token_iterator (публичная функция-член) |
| обращается к текущему подсовпадению (публичная функция-член) |
|
| перемещает итератор к следующему подсовпадению (публичная функция-член) |
Примечания
Программа должна гарантировать, что объект 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] |
-
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