Namensräume
Varianten
Aktionen

std::regex_token_iterator

Von cppreference.com
< cpp‎ | regex
 
 
 
Bibliothek für reguläre Ausdrücke
Klassen
(C++11)
Algorithmen
Iteratoren
regex_token_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_token_iterator
(seit C++11)

std::regex_token_iterator ist ein schreibgeschützter LegacyForwardIterator, der auf die einzelnen Teilübereinstimmungen jeder Übereinstimmung eines regulären Ausdrucks in der zugrunde liegenden Zeichensequenz zugreift. Er kann auch verwendet werden, um auf die Teile der Sequenz zuzugreifen, die von dem gegebenen regulären Ausdruck nicht abgeglichen wurden (z. B. als Tokenizer).

Bei der Konstruktion wird ein std::regex_iterator konstruiert, und bei jedem Inkrementieren werden die angeforderten Teilübereinstimmungen aus den aktuellen match_results durchlaufen, wobei der zugrunde liegende std::regex_iterator beim Inkrementieren weg von der letzten Teilübereinstimmung erhöht wird.

Der standardkonstruierte std::regex_token_iterator ist der End-of-Sequence-Iterator. Wenn ein gültiger std::regex_token_iterator nach Erreichen der letzten Teilübereinstimmung der letzten Übereinstimmung inkrementiert wird, wird er gleich dem End-of-Sequence-Iterator. Das Dereferenzieren oder weitere Inkrementieren führt zu undefiniertem Verhalten.

Kurz bevor er zum End-of-Sequence-Iterator wird, kann ein std::regex_token_iterator ein Suffix-Iterator werden, wenn der Index -1 (nicht abgeglichenes Fragment) in der Liste der angeforderten Unterabgleichsindizes vorkommt. Ein solcher Iterator gibt bei Dereferenzierung match_results zurück, die der Sequenz von Zeichen zwischen der letzten Übereinstimmung und dem Ende der Sequenz entsprechen.

Eine typische Implementierung von std::regex_token_iterator speichert den zugrunde liegenden std::regex_iterator, einen Container (z. B. std::vector<int>) der angeforderten Unterabgleichsindizes, einen internen Zähler, der dem Index der Teilübereinstimmung entspricht, einen Zeiger auf std::sub_match, der auf die aktuelle Teilübereinstimmung der aktuellen Übereinstimmung zeigt, und ein std::match_results-Objekt, das die letzte nicht übereinstimmende Zeichensequenz enthält (verwendet im Tokenizer-Modus).

Inhalt

[edit] Typanforderungen

-
BidirIt muss die Anforderungen von LegacyBidirectionalIterator erfüllen.

[edit] Spezialisierungen

Mehrere Spezialisierungen für gängige Zeichensatztypen sind definiert

Definiert in Header <regex>
Typ Definition
std::cregex_token_iterator std::regex_token_iterator<const char*>
std::wcregex_token_iterator std::regex_token_iterator<const wchar_t*>
std::sregex_token_iterator std::regex_token_iterator<std::string::const_iterator>
std::wsregex_token_iterator std::regex_token_iterator<std::wstring::const_iterator>

[edit] Mitgliedstypen

Mitgliedertyp Definition
value_type std::sub_match<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] Memberfunktionen

konstruiert einen neuen regex_token_iterator
(public member function) [edit]
(Destruktor)
(implizit deklariert)
zerstört einen regex_token_iterator, einschließlich des zwischengespeicherten Werts
(public member function) [edit]
weist Inhalte zu
(public member function) [edit]
(in C++20 entfernt)
vergleicht zwei regex_token_iterators
(public member function) [edit]
greift auf die aktuelle Teilübereinstimmung zu
(public member function) [edit]
bewegt den Iterator zur nächsten Teilübereinstimmung
(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 std::regex_iterator speichert, der einen Zeiger auf das Regex speichert, führt das Inkrementieren des Iterators nach der Zerstörung des Regex zu undefiniertem Verhalten.

[edit] Beispiel

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
 
int main()
{
    // Tokenization (non-matched fragments)
    // Note that regex is matched only two times; when the third value is obtained
    // the iterator is a suffix iterator.
    const std::string text = "Quick brown fox.";
    const std::regex ws_re("\\s+"); // whitespace
    std::copy(std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
 
    std::cout << '\n';
 
    // Iterating the first submatches
    const std::string html = R"(<p><a href="http://google.com">google</a> )"
                             R"(< a HREF ="http://cppreference.de">cppreference</a>\n</p>)";
    const std::regex url_re(R"!!(<\s*A\s+[^>]*href\s*=\s*"([^"]*)")!!", std::regex::icase);
    std::copy(std::sregex_token_iterator(html.begin(), html.end(), url_re, 1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

Ausgabe

Quick
brown
fox.
 
http://google.com
https://cppreference.de

[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_token_iterator war ein forward_iterator
während er ein Stashing-Iterator war
gemacht zu einem input_iterator[1]
  1. iterator_category wurde durch die Auflösung nicht geändert, da eine Änderung zu std::input_iterator_tag zu viel bestehenden Code brechen könnte.