std::regex_iterator
Определено в заголовке <regex> | ||
|---|---|---|
template<
class BidirIt,
class CharT = typename std::iterator_traits<BidirIt>::value_type,
class Traits = std::regex_traits<CharT>
> class regex_iterator
| (с C++11) |
std::regex_iterator — это только для чтения итератор, который предоставляет доступ к отдельным совпадениям регулярного выражения в базовой последовательности символов. Он удовлетворяет требованиям LegacyForwardIterator, за исключением того, что для адресуемых значений a и b с a == b, *a и *b не будут связаны с одним и тем же объектом.
При создании и при каждом инкременте он вызывает std::regex_search и запоминает результат (то есть сохраняет копию значения std::match_results<BidirIt>). Первый объект можно прочитать при создании итератора или при первом обращении к нему с помощью операции разыменования. В противном случае разыменование возвращает только копию последнего полученного совпадения регулярного выражения.
Итератор std::regex_iterator, созданный по умолчанию, является итератором конца последовательности. Когда действительный std::regex_iterator инкрементируется после достижения последнего совпадения (std::regex_search возвращает false), он становится равным итератору конца последовательности. Дальнейшее разыменование или инкрементирование вызывают неопределенное поведение.
Типичная реализация std::regex_iterator содержит начальный и конечный итераторы для базовой последовательности (два экземпляра BidirIt), указатель на регулярное выражение (const regex_type*), флаги совпадения (std::regex_constants::match_flag_type) и текущее совпадение (std::match_results<BidirIt>).
Требования к типу
-BidirIt должен удовлетворять требованиям LegacyBidirectionalIterator. |
Специализации
Определены несколько специализаций для общих типов последовательностей символов:
Определено в заголовке <regex> |
|
|---|---|
| Тип | Определение |
std::cregex_iterator | std::regex_iterator<const char*> |
std::wcregex_iterator | std::regex_iterator<const wchar_t*> |
std::sregex_iterator | std::regex_iterator<std::string::const_iterator> |
std::wsregex_iterator | std::regex_iterator<std::wstring::const_iterator> |
Типы-члены
| Тип-член | Определение |
|---|---|
value_type | std::match_results<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_iterator (публичная функция-член) |
|
| (деструктор)
(неявно объявлен) | удаляет regex_iterator, включая кешированное значение (публичная функция-член) |
| присваивает содержимое (публичная функция-член) |
|
|
(удалено в C++20) | сравнивает два regex_iterator (публичная функция-член) |
| обращается к текущему совпадению (публичная функция-член) |
|
| перемещает итератор к следующему совпадению (публичная функция-член) |
Примечания
Программист несет ответственность за обеспечение того, чтобы объект std::basic_regex , переданный в конструктор итератора, существовал дольше, чем сам итератор. Поскольку итератор хранит указатель на регулярное выражение, инкрементирование итератора после удаления регулярного выражения приводит к обращению к висящему указателю.
Если часть регулярного выражения, к которой произошло совпадение, представляет собой только утверждение (^, $, \b, \B), то хранимое в итераторе совпадение имеет длину 0, то есть match[0].first == match[0].second.
Пример
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
const std::string s = "Quick brown fox.";
std::regex words_regex("[^\\s]+");
auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);
auto words_end = std::sregex_iterator();
std::cout << "Found " << std::distance(words_begin, words_end) << " words:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i)
{
std::smatch match = *i;
std::string match_str = match.str();
std::cout << match_str << '\n';
}
}Вывод:
Found 3 words: Quick brown fox.
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применимо к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
|
LWG 3698 (P2770R0) | C++20 |
regex_iterator был forward_iteratorв то время как являлся итератором хранения | превращён в input_iterator[1] |
-
iterator_categoryостался без изменений в результате решения, поскольку изменение его наstd::input_iterator_tagможет сломать слишком много существующего кода.
См. также
|
(C++11) | определяет одно совпадение регулярного выражения, включая все совпадения подвыражений (шаблон класса) |
||
|
(C++11) | пытается сопоставить регулярное выражение с любой частью последовательности символов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/regex/regex_iterator
|
|