std:: regex_token_iterator
|
Определено в заголовочном файле
<regex>
|
||
|
template
<
class
BidirIt,
|
(начиная с 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]
|
-
↑
iterator_categoryне был изменен в результате решения, поскольку изменение его на std::input_iterator_tag могло нарушить слишком много существующего кода.