std::regex_token_iterator
| Definiert in 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 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) | |
| (Destruktor) (implizit deklariert) |
zerstört einen regex_token_iterator, einschließlich des zwischengespeicherten Werts(public member function) |
| weist Inhalte zu (public member function) | |
| (in C++20 entfernt) |
vergleicht zwei regex_token_iterators(public member function) |
| greift auf die aktuelle Teilübereinstimmung zu (public member function) | |
| bewegt den Iterator zur nächsten Teilübereinstimmung (public member function) |
[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_iteratorwährend er ein Stashing-Iterator war |
gemacht zu einem input_iterator[1] |
- ↑
iterator_categorywurde durch die Auflösung nicht geändert, da eine Änderung zu std::input_iterator_tag zu viel bestehenden Code brechen könnte.