std:: regex_iterator
|
Definiert in Header
<regex>
|
||
|
template
<
class
BidirIt,
|
(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. Es 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 werden.
Bei der Erstellung und bei jedem Inkrement ruft es std::regex_search auf und speichert das Ergebnis (das heißt, es sichert eine Kopie des std:: match_results < BidirIt > -Werts). Das erste Objekt kann ausgelesen werden, wenn der Iterator erstellt wird oder wenn die erste Dereferenzierung erfolgt. Andernfalls gibt die Dereferenzierung nur eine Kopie des zuletzt erhaltenen Regex-Matches zurück.
Der standardmäßig konstruierte
std::regex_iterator
ist der End-of-Sequence-Iterator. Wenn ein gültiger
std::regex_iterator
nach Erreichen des letzten Treffers inkrementiert wird (
std::regex_search
gibt
false
zurück), wird er gleich dem End-of-Sequence-Iterator. Das Dereferenzieren oder weitere Inkrementieren ruft undefiniertes Verhalten hervor.
Eine typische Implementierung von
std::regex_iterator
enthält die Start- und End-Iteratoren für die zugrundeliegende Sequenz (zwei Instanzen von
BidirIt
), einen Zeiger auf den regulären Ausdruck (
const
regex_type
*
), die Match-Flags (
std::regex_constants::match_flag_type
) und den aktuellen Match (
std::
match_results
<
BidirIt
>
).
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_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 > |
Mitgliedertypen
| Typ | Definition |
value_type
|
std:: match_results < 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 > |
Datenmitglieder
| Mitglied | Beschreibung |
BidiIt
begin
(privat)
|
der Begin-Iterator
( Nur-Darstellungs-Mitgliedsobjekt* ) |
BidiIt
end
(privat)
|
der End-Iterator
( Nur-Darstellungs-Mitgliedsobjekt* ) |
const
regex_type
*
pregex
(privat)
|
ein Zeiger auf einen regulären Ausdruck
( Nur-Darstellungs-Mitgliedsobjekt* ) |
regex_constants
::
match_flag_type
flags
(privat)
|
ein Flag
( Nur-Darstellungs-Mitgliedsobjekt* ) |
match_results
<
BidiIt
>
match
(privat)
|
der aktuelle Treffer
( Nur-Darstellungs-Mitgliedsobjekt* ) |
Memberfunktionen
konstruiert einen neuen
regex_iterator
(öffentliche Elementfunktion) |
|
|
(destructor)
(implizit deklariert)
|
zerstört einen
regex_iterator
, einschließlich des zwischengespeicherten Werts
(öffentliche Elementfunktion) |
|
weist Inhalte zu
(öffentliche Elementfunktion) |
|
|
(entfernt in C++20)
|
vergleicht zwei
regex_iterator
s
(öffentliche Elementfunktion) |
|
greift auf die aktuelle Übereinstimmung zu
(öffentliche Elementfunktion) |
|
|
bewegt den Iterator zur nächsten Übereinstimmung
(öffentliche Elementfunktion) |
Hinweise
Es liegt in der Verantwortung des Programmierers sicherzustellen, dass das std::basic_regex -Objekt, das an den Konstruktor des Iterators übergeben wird, länger existiert als der Iterator. Da der Iterator einen Zeiger auf das Regex-Objekt speichert, führt das Inkrementieren des Iterators nach der Zerstörung des Regex-Objekts 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 Übereinstimmung der Länge Null, das heißt,
match
[
0
]
.
first
==
match
[
0
]
.
second
.
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.
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
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 bestehenden Code brechen könnte.
Siehe auch
|
(C++11)
|
identifiziert einen regulären Ausdrucks-Treffer, einschließlich aller Teilausdrucks-Treffer
(Klassen-Template) |
|
(C++11)
|
versucht, einen regulären Ausdruck mit einem beliebigen Teil einer Zeichensequenz abzugleichen
(Funktions-Template) |