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, включая кэшированное значение (открытая функция-член) |
| присваивает содержимое (открытая функция-член) |
|
|
(удалён в 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++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
|
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/cpp/regex/regex_token_iterator