Reguläre Ausdrücke Bibliothek (seit C++11)
Die Bibliothek für reguläre Ausdrücke stellt eine Klasse zur Verfügung, die reguläre Ausdrücke darstellt. Dies ist eine Art Minisprache, die zur Mustererkennung in Zeichenketten verwendet wird. Fast alle Operationen mit regulären Ausdrücken lassen sich durch die Arbeit mit mehreren der folgenden Objekte charakterisieren:
- Zielsequenz. Die Zeichensequenz, in der nach einem Muster gesucht wird. Dies kann ein Bereich sein, der durch zwei Iteratoren angegeben wird, eine nullterminierte Zeichenkette oder ein std::string.
- Muster. Dies ist der reguläre Ausdruck selbst. Er bestimmt, was eine Übereinstimmung darstellt. Es ist ein Objekt vom Typ std::basic_regex, das aus einer Zeichenkette mit spezieller Grammatik erstellt wird.
- Übereinstimmendes Array. Informationen über Übereinstimmungen können als Objekt vom Typ std::match_results abgerufen werden.
- Ersetzungszeichenkette. Dies ist eine Zeichenkette, die bestimmt, wie Übereinstimmungen ersetzt werden sollen.
Inhalt |
[bearbeiten] Reguläre Ausdrucksgrammatiken
Muster und Ersetzungszeichenketten unterstützen die folgenden Grammatiken für reguläre Ausdrücke:
- Modifizierte ECMAScript-Grammatik für reguläre Ausdrücke. Dies ist die Standardgrammatik.
- Grundlegende POSIX-Grammatik für reguläre Ausdrücke.
- Erweiterte POSIX-Grammatik für reguläre Ausdrücke.
- Die Grammatik für reguläre Ausdrücke, die vom Dienstprogramm awk in POSIX verwendet wird.
- Die Grammatik für reguläre Ausdrücke, die vom Dienstprogramm grep in POSIX verwendet wird. Dies ist im Wesentlichen dieselbe wie die grundlegende POSIX-Grammatik für reguläre Ausdrücke, mit der zusätzlichen Berücksichtigung des Zeilenumbruchs '\n' als Alternativseparator.
- Die Grammatik für reguläre Ausdrücke, die vom Dienstprogramm grep mit der Option -E in POSIX verwendet wird. Dies ist im Wesentlichen dieselbe wie die erweiterte POSIX-Grammatik für reguläre Ausdrücke, mit der zusätzlichen Berücksichtigung des Zeilenumbruchs '\n' als Alternativseparator zusätzlich zu '|'.
Einige Grammatikvariationen (wie die Groß-/Kleinschreibung-unabhängige Übereinstimmung) sind ebenfalls verfügbar. Einzelheiten finden Sie auf dieser Seite.
[bearbeiten] Hauptklassen
Diese Klassen kapseln einen regulären Ausdruck und die Ergebnisse der Übereinstimmung eines regulären Ausdrucks innerhalb einer Zielzeichensequenz.
| (C++11) |
Objekt für reguläre Ausdrücke (Klassenvorlage) |
| (C++11) |
identifiziert die von einer Unterexpression abgeglichene Zeichensequenz (Klassenvorlage) |
| (C++11) |
identifiziert eine Übereinstimmung eines regulären Ausdrucks, einschließlich aller Übereinstimmungen von Unterausdrücken (Klassenvorlage) |
[bearbeiten] Algorithmen
Diese Funktionen werden verwendet, um den in einem Regex gekapselten regulären Ausdruck auf eine Zielzeichensequenz anzuwenden.
| (C++11) |
versucht, einen regulären Ausdruck an eine gesamte Zeichensequenz anzupassen (Funktionsvorlage) |
| (C++11) |
versucht, einen regulären Ausdruck an einen beliebigen Teil einer Zeichensequenz anzupassen (Funktionsvorlage) |
| (C++11) |
ersetzt Vorkommen eines regulären Ausdrucks durch formatierten Ersetzungstext (Funktionsvorlage) |
[bearbeiten] Iteratoren
Die Regex-Iteratoren werden verwendet, um die gesamte Menge der in einer Sequenz gefundenen Übereinstimmungen regulärer Ausdrücke zu durchlaufen.
| (C++11) |
iteriert durch alle Regex-Übereinstimmungen in einer Zeichensequenz (Klassenvorlage) |
| (C++11) |
iteriert durch die angegebenen Unterausdrücke innerhalb aller Regex-Übereinstimmungen in einer gegebenen Zeichenkette oder durch nicht übereinstimmende Teilzeichenketten (Klassenvorlage) |
[bearbeiten] Ausnahmen
Diese Klasse definiert den Typ von Objekten, die als Ausnahmen geworfen werden, um Fehler aus der Bibliothek für reguläre Ausdrücke zu melden.
| (C++11) |
meldet Fehler, die von der Bibliothek für reguläre Ausdrücke generiert wurden (Klasse) |
[bearbeiten] Traits
Die Klasse für Regex-Traits wird verwendet, um die lokalisierbaren Aspekte eines regulären Ausdrucks zu kapseln.
| (C++11) |
stellt Metainformationen über einen Zeichentyp bereit, die von der Regex-Bibliothek benötigt werden (Klassenvorlage) |
[bearbeiten] Konstanten
| Definiert im Namensraum
std::regex_constants | |
| (C++11) |
allgemeine Optionen zur Steuerung des Verhaltens von regulären Ausdrücken (Typalias) |
| (C++11) |
Optionen speziell für die Übereinstimmung (Typalias) |
| (C++11) |
beschreibt verschiedene Arten von Übereinstimmungsfehlern (Typalias) |
[bearbeiten] Beispiel
#include <iostream> #include <iterator> #include <regex> #include <string> int main() { std::string s = "Some people, when confronted with a problem, think " "\"I know, I'll use regular expressions.\" " "Now they have two problems."; std::regex self_regex("REGULAR EXPRESSIONS", std::regex_constants::ECMAScript | std::regex_constants::icase); if (std::regex_search(s, self_regex)) std::cout << "Text contains the phrase 'regular expressions'\n"; std::regex word_regex("(\\w+)"); auto words_begin = std::sregex_iterator(s.begin(), s.end(), word_regex); auto words_end = std::sregex_iterator(); std::cout << "Found " << std::distance(words_begin, words_end) << " words\n"; const int N = 6; std::cout << "Words longer than " << N << " characters:\n"; for (std::sregex_iterator i = words_begin; i != words_end; ++i) { std::smatch match = *i; std::string match_str = match.str(); if (match_str.size() > N) std::cout << " " << match_str << '\n'; } std::regex long_word_regex("(\\w{7,})"); std::string new_s = std::regex_replace(s, long_word_regex, "[$&]"); std::cout << new_s << '\n'; }
Ausgabe
Text contains the phrase 'regular expressions' Found 20 words Words longer than 6 characters: confronted problem regular expressions problems Some people, when [confronted] with a [problem], think "I know, I'll use [regular] [expressions]." Now they have two [problems].