std:: regex_token_iterator
|
Definiert im Header
<regex>
|
||
|
template
<
class
BidirIt,
|
(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]
|
-
↑
iterator_categorywurde durch die Resolution nicht geändert, da eine Änderung zu std::input_iterator_tag zu viel existierenden Code brechen könnte.