std:: regex_iterator
|
Определено в заголовочном файле
<regex>
|
||
|
template
<
class
BidirIt,
|
(начиная с 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 > |
Члены данных
| Член | Описание |
BidiIt
begin
(private)
|
начальный итератор
( объект-член только для демонстрации* ) |
BidiIt
end
(private)
|
конечный итератор
( объект-член только для демонстрации* ) |
const
regex_type
*
pregex
(private)
|
указатель на регулярное выражение
( объект-член только для демонстрации* ) |
regex_constants
::
match_flag_type
flags
(private)
|
флаг
( объект-член только для демонстрации* ) |
match_results
<
BidiIt
>
match
(private)
|
текущее соответствие
( объект-член только для демонстрации* ) |
Функции-члены
создает новый
regex_iterator
(публичная функция-член) |
|
|
(destructor)
(неявно объявлен)
|
уничтожает
regex_iterator
, включая кэшированное значение
(публичная функция-член) |
|
присваивает содержимое
(публичная функция-член) |
|
|
(удален в C++20)
|
сравнивает два
regex_iterator
а
(публичная функция-член) |
|
получает доступ к текущему совпадению
(публичная функция-член) |
|
|
перемещает итератор к следующему совпадению
(публичная функция-член) |
Примечания
Это ответственность программиста обеспечить, чтобы объект std::basic_regex переданный в конструктор итератора переживал сам итератор. Поскольку итератор хранит указатель на регулярное выражение, инкрементирование итератора после уничтожения регулярного выражения приводит к обращению к висячему указателю.
Если часть регулярного выражения, которая совпала, является только
утверждением
(
^
,
$
,
\b
,
\B
), то совпадение, хранимое в итераторе, является совпадением нулевой длины, то есть
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
будучи stashing итератором |
сделан
input_iterator
[1]
|
-
↑
iterator_categoryне был изменен в результате этого решения, поскольку изменение его на std::input_iterator_tag могло бы нарушить слишком много существующего кода.
Смотрите также
|
(C++11)
|
идентифицирует одно совпадение регулярного выражения, включая все совпадения подвыражений
(шаблон класса) |
|
(C++11)
|
пытается сопоставить регулярное выражение с любой частью последовательности символов
(шаблон функции) |