Spec-Zone.ru › C++

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), указатель на регулярное выражение (constregex_type*), флаги совпадения (std::regex_constants::match_flag_type) и текущее совпадение (std::match_results<BidirIt>).

Требования к типам

-BidirIt должен соответствовать требованиям LegacyBidirectionalIterator.

Специализации

Определено несколько специализаций для распространённых типов последовательностей символов:

Определено в заголовочном файле <regex>
Тип Определение
std::cregex_iterator std::regex_iterator<constchar*>
std::wcregex_iterator std::regex_iterator<constwchar_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 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>

Члены-данные

Член Описание
BidiIt begin (закрытый) итератор начала
(член-объект только для описания)
BidiIt end (закрытый) итератор конца
(член-объект только для описания)
constregex_type* pregex (закрытый) указатель на регулярное выражение
(член-объект только для описания)
regex_constants::match_flag_type flags (закрытый) флаг
(член-объект только для описания)
match_results<BidiIt> match (закрытый) текущее совпадение
(член-объект только для описания)

Функции-члены

(конструктор)
создаёт новый regex_iterator
(открытая функция-член)
(деструктор)
(объявлен неявно)
уничтожает regex_iterator вместе с кэшированным значением
(открытая функция-член)
operator=
присваивает содержимое
(открытая функция-член)
operator==operator!=
(удалены в C++20)
сравнивает два regex_iteratorа
(открытая функция-член)
operator*operator->
обращается к текущему совпадению
(открытая функция-член)
operator++operator++(int)
перемещает итератор к следующему совпадению
(открытая функция-член)

Примечания

Программист несёт ответственность за то, чтобы объект 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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 3698
(P2770R0)
C++20 regex_iterator был forward_iterator
при этом являясь итератором с сохранением значения
стал input_iterator[1]
  1. iterator_category не изменился в результате принятого решения, поскольку его изменение на std::input_iterator_tag могло бы нарушить работу слишком большого количества существующего кода.

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/regex/regex_iterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API