Namespaces
Variants

std:: regex_iterator

From ru.cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_iterator
(C++11)
Exceptions
Traits
Constants
(C++11)
Regex Grammar
Определено в заголовочном файле <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 >

Члены данных

Член Описание
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]
  1. ↑ iterator_category не был изменен в результате этого решения, поскольку изменение его на std::input_iterator_tag могло бы нарушить слишком много существующего кода.

Смотрите также

идентифицирует одно совпадение регулярного выражения, включая все совпадения подвыражений
(шаблон класса)
пытается сопоставить регулярное выражение с любой частью последовательности символов
(шаблон функции)