Namensräume
Varianten
Aktionen

std::regex_iterator

Von cppreference.com
< cpp‎ | regex
 
 
 
Bibliothek für reguläre Ausdrücke
Klassen
(C++11)
Algorithmen
Iteratoren
regex_iterator
(C++11)
Ausnahmen
Traits
Konstanten
(C++11)
Reguläre Ausdrucksgrammatiken
 
 
Definiert in Header <regex>
template<

    class BidirIt,
    class CharT = typename std::iterator_traits<BidirIt>::value_type,
    class Traits = std::regex_traits<CharT>

> class regex_iterator
(seit C++11)

std::regex_iterator ist ein schreibgeschützter Iterator, der auf die einzelnen Übereinstimmungen eines regulären Ausdrucks innerhalb der zugrunde liegenden Zeichensequenz zugreift. Er erfüllt die Anforderungen eines LegacyForwardIterator, mit der Ausnahme, dass für dereferenzierbare Werte a und b mit a == b, *a und *b nicht an dasselbe Objekt gebunden sind.

Bei der Konstruktion und bei jeder Inkrementierung wird std::regex_search aufgerufen und das Ergebnis gespeichert (d. h. eine Kopie des Werts std::match_results<BidirIt> wird gespeichert). Das erste Objekt kann beim Konstruieren des Iterators oder bei der ersten Dereferenzierung gelesen werden. Andernfalls gibt die Dereferenzierung nur eine Kopie der zuletzt erhaltenen regulären Ausdrucksübereinstimmung zurück.

Der standardkonstruierte std::regex_iterator ist der End-of-Sequence-Iterator. Wenn ein gültiger std::regex_iterator nach Erreichen der letzten Übereinstimmung (wenn std::regex_search false zurückgibt) inkrementiert wird, wird er gleich dem End-of-Sequence-Iterator. Das Dereferenzieren oder weitere Inkrementieren führt zu undefiniertem Verhalten.

Eine typische Implementierung von std::regex_iterator speichert die Beginn- und End-Iteratoren für die zugrunde liegende Sequenz (zwei Instanzen von BidirIt), einen Zeiger auf den regulären Ausdruck (const regex_type*), die Übereinstimmungsflags (std::regex_constants::match_flag_type) und die aktuelle Übereinstimmung (std::match_results<BidirIt>).

Inhalt

[edit] Typanforderungen

-
BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen.

[edit] Spezialisierungen

Mehrere Spezialisierungen für gängige Zeichensequenztypen sind definiert

Definiert in Header <regex>
Typ Definition
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>

[edit] Member-Typen

Typ Definition
value_type std::match_results<BidirIt>
difference_type std::ptrdiff_t
Zeiger const value_type*
Referenz const value_type&
iterator_category std::forward_iterator_tag
iterator_concept (C++20) std::input_iterator_tag
regex_type std::basic_regex<CharT, Traits>

[edit] Datenmember

Mitglied Beschreibung
BidiIt begin (private) der Begin-Iterator
((exposition-only member object*)
BidiIt end (private) der End-Iterator
((exposition-only member object*)
const regex_type* pregex (private) ein Zeiger auf einen regulären Ausdruck
((exposition-only member object*)
regex_constants::match_flag_type flags (private) ein Flag
((exposition-only member object*)
match_results<BidirIt> match (private) die aktuelle Übereinstimmung
((exposition-only member object*)

[edit] Member-Funktionen

konstruiert einen neuen regex_iterator
(public member function) [edit]
(Destruktor)
(implizit deklariert)
destruiert einen regex_iterator, einschließlich des zwischengespeicherten Werts
(public member function) [edit]
weist Inhalte zu
(public member function) [edit]
(in C++20 entfernt)
vergleicht zwei regex_iterators
(public member function) [edit]
greift auf die aktuelle Übereinstimmung zu
(public member function) [edit]
rückt den Iterator zur nächsten Übereinstimmung vor
(public member function) [edit]

[edit] Hinweise

Es liegt in der Verantwortung des Programmierers sicherzustellen, dass das Objekt std::basic_regex, das an den Konstruktor des Iterators übergeben wird, den Iterator überlebt. Da der Iterator einen Zeiger auf den regulären Ausdruck speichert, führt das Inkrementieren des Iterators, nachdem der reguläre Ausdruck zerstört wurde, zum Zugriff auf einen hängenden Zeiger.

Wenn der Teil des regulären Ausdrucks, der übereinstimmt, nur eine Assertion ist (^, $, \b, \B), dann ist die im Iterator gespeicherte Übereinstimmung eine Null-Längen-Übereinstimmung, d. h. match[0].first == match[0].second.

[edit] Beispiel

#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';
    }
}

Ausgabe

Found 3 words:
Quick
brown
fox.

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3698
(P2770R0)
C++20 regex_iterator war ein forward_iterator
während er ein Stashing-Iterator war
machte ihn zu einem input_iterator[1]
  1. iterator_category wurde durch die Auflösung nicht verändert, da eine Änderung zu std::input_iterator_tag zu viel bestehenden Code brechen könnte.

[edit] Siehe auch

identifiziert eine Übereinstimmung eines regulären Ausdrucks, einschließlich aller Übereinstimmungen von Unterausdrücken
(Klassenvorlage) [bearbeiten]
versucht, einen regulären Ausdruck an einen beliebigen Teil einer Zeichensequenz anzupassen
(Funktionsvorlage) [bearbeiten]