Namespaces
Variants

std:: regex_token_iterator

From cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_token_iterator
(C++11)
Exceptions
Traits
Constants
(C++11)
Regex Grammar
Definiert im 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 innerhalb der zugrunde liegenden Zeichensequenz zugreift. Es kann auch verwendet werden, um auf die Teile der Sequenz zuzugreifen, die nicht mit dem gegebenen regulären Ausdruck übereinstimmen (z.B. als Tokenizer).

Bei der Konstruktion erzeugt es einen std::regex_iterator und bei jedem Inkrement durchläuft es die angeforderten Teilübereinstimmungen aus den aktuellen match_results, wobei der zugrunde liegende std::regex_iterator inkrementiert wird, wenn von der letzten Teilübereinstimmung weg inkrementiert wird.

Der standardmäßig konstruierte std::regex_token_iterator ist der End-of-Sequence-Iterator. Wenn ein gültiger std::regex_token_iterator nach Erreichen des letzten Submatches des letzten Treffers inkrementiert wird, wird er gleich dem End-of-Sequence-Iterator. Das Dereferenzieren oder weitere Inkrementieren ruft undefiniertes Verhalten hervor.

Kurz bevor es zum End-of-Sequence-Iterator wird, kann ein std::regex_token_iterator zu einem suffix iterator werden, falls der Index - 1 (nicht übereinstimmendes Fragment) in der Liste der angeforderten Teilübereinstimmungsindizes erscheint. Ein solcher Iterator gibt, wenn dereferenziert, ein match_results zurück, das der Zeichensequenz zwischen der letzten Übereinstimmung und dem Ende der Sequenz entspricht.

Eine typische Implementierung von std::regex_token_iterator enthält den zugrundeliegenden std::regex_iterator , einen Container (z.B. std:: vector < int > ) der angeforderten Teilübereinstimmungsindizes, einen internen Zähler gleich dem Index der Teilübereinstimmung, 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).

Inhaltsverzeichnis

Typanforderungen

-
BidirIt muss die Anforderungen eines LegacyBidirectionalIterator erfüllen.

Spezialisierungen

Für häufige Zeichensequenztypen sind mehrere Spezialisierungen definiert:

Definiert im 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 >

Mitgliedertypen

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

Memberfunktionen

konstruiert einen neuen regex_token_iterator
(public member function)
(destructor)
(implicitly declared)
zerstört einen regex_token_iterator , einschließlich des zwischengespeicherten Werts
(public member function)
weist Inhalte zu
(public member function)
(removed in C++20)
vergleicht zwei regex_token_iterator s
(public member function)
greift auf aktuellen Submatch zu
(public member function)
bewegt den Iterator zum nächsten Submatch
(public member function)

Hinweise

Es liegt in der Verantwortung des Programmierers sicherzustellen, dass das std::basic_regex -Objekt, das an den Konstruktor des Iterators übergeben wird, diesen überlebt. Da der Iterator einen std::regex_iterator speichert, der einen Zeiger auf das Regex-Objekt enthält, führt das Inkrementieren des Iterators nach der Zerstörung des Regex-Objekts zu undefiniertem Verhalten.

Beispiel

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
int main()
{
    // Tokenisierung (nicht übereinstimmende Fragmente)
    // Beachten Sie, dass der Regex nur zweimal übereinstimmt; wenn der dritte Wert erhalten wird
    // ist der Iterator ein Suffix-Iterator.
    const std::string text = "Quick brown fox.";
    const std::regex ws_re("\\s+"); // Leerzeichen
    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';
    // Iterieren über die ersten Teilübereinstimmungen
    const std::string html = R"(<p><a href="http://google.com">google</a> )"
                             R"(< a HREF ="http://cppreference.net">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
http://cppreference.net

Fehlerberichte

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

DR Angewendet auf Veröffentlichtes Verhalten Korrigiertes Verhalten
LWG 3698
( P2770R0 )
C++20 regex_token_iterator war ein forward_iterator
obwohl es ein stashing Iterator war
zu input_iterator geändert [1]
  1. iterator_category wurde durch die Resolution nicht geändert, da eine Änderung zu std::input_iterator_tag zu viel existierenden Code brechen könnte.