C++-Standardbibliothek<regex>
In der C++-Standardbibliothek bietet die<regex>Header-Datei Funktionen für reguläre Ausdrücke, mit denen Entwickler Zeichenfolgen sehr flexibel durchsuchen, ersetzen oder aufteilen können. Reguläre Ausdrücke sind ein leistungsstarkes Werkzeug zur Textverarbeitung und werden häufig in Bereichen wie Datenvalidierung, Textanalyse und Musterabgleich eingesetzt.
Ein regulärer Ausdruck ist ein Muster, das mithilfe einer einzelnen Zeichenfolge eine Reihe von Zeichenfolgen beschreibt und abgleicht, die einer bestimmten Syntaxregel entsprechen. In C++ werden reguläre Ausdrücke durch die<regex>Bibliotheksimplementierung.
In C++11s<regex>Wenn Sie reguläre Ausdrücke verwenden, müssen Sie Backslashes in Zeichenkettenliteralen escapen.\escapen Sie ihn, das heißt, schreiben Sie ihn als doppelten Backslash\\。
Warum doppelter Backslash?
Der C++-Compiler verarbeitet Escape-Zeichen in Zeichenkettenliteralen zuerst, während die Regex-Engine sie danach verarbeitet.
Zum Beispiel schreiben Sie\d+, der Compiler wird\des wird als unbekanntes Escape-Zeichen behandelt, was einen Fehler verursacht, oder wird zud, die korrekte Syntax\\d+, der Compiler zuerst\\umwandeln in\, und wenn die Regex-Engine dann liest\d。
C++11 unterstützt auch Raw-Strings, die doppelte Backslashes vermeiden können und sich sehr gut zum Schreiben komplexer Regexe eignen:regex re(R"(\d+)"); // 原始字符串,不需要写 \\d
- Der Inhalt innerhalb von R"(...)" unterliegt keiner Escape-Verarbeitung.
- Es wird empfohlen, dies beim Schreiben komplexer Regexe mit mehreren Backslashes zu verwenden.
Grundlegende Syntax
Grundlegende Bestandteile regulärer Ausdrücke
- Zeichenklasse: wie zum Beispiel
[abc]Gibt an, dass ein beliebiges einzelnes Zeichen aus a, b oder c übereinstimmt. - Quantifizierer: wie zum Beispiel
*(null oder mehrmals),+(einmal oder mehrmals),?(null oder einmal). - Grenzübereinstimmung: wie zum Beispiel
^(Zeilenanfang),$(Zeilenende). - Gruppierung: mithilfe von Klammern
()um eine Gruppe zu erstellen.
C++ <regex>Hauptklassen und Funktionen der Bibliothek
std::regex: repräsentiert ein Objekt für reguläre Ausdrücke.std::regex_match: Prüft, ob die gesamte Zeichenkette mit dem regulären Ausdruck übereinstimmt.std::regex_search: durchsucht die Zeichenkette nach Teilen, die mit dem regulären Ausdruck übereinstimmen.std::regex_replace: Ersetzt die Teile der Zeichenkette, die mit dem regulären Ausdruck übereinstimmen.std::sregex_iterator: Ein Iterator, der verwendet wird, um alle Übereinstimmungen zu durchlaufen.
Beispiel
1. Gesamtabgleich: regex_match
Beispiel
#include <regex>
using namespace std;
int main() {
regex re("\\d+"); // Ziffern abgleichen
string s = "12345";
if (regex_match(s, re))
cout << "Übereinstimmung erfolgreich\n";
else
cout << "Übereinstimmung fehlgeschlagen\n";
}
Ausgabeergebnis:
Match successful
2. Prüfen, ob die Zeichenkette mit dem regulären Ausdruck übereinstimmt
Beispiel
#include <string>
#include <regex>
using namespace std;
int main() {
string text = "Hallo, Welt!";
Regex-Muster("^[a-zA-Z]+, [a-zA-Z]+!$");
if (regex_match(text, pattern)) {
cout << "Die Zeichenkette stimmt mit dem Muster überein." << endl;
} else {
cout << "Die Zeichenkette stimmt nicht mit dem Muster überein." << endl;
}
return 0;
}
Ausgabeergebnis:
The string matches the pattern.
3. Nach Übereinstimmungen in einer Zeichenkette suchen
Beispiel
#include <string>
#include <regex>
using namespace std;
int main() {
string text = "123-456-7890 und 987-654-3210";
Regex-Muster("\\d{3}-\\d{3}-\\d{4}");
smatch matches;
while (regex_search(text, matches, pattern)) {
cout << "Gefunden: " << matches[0] << endl;
text = matches.suffix().str(); // Suche im Rest fortsetzen
}
return 0;
}
Ausgabeergebnis:
Found: 123-456-7890 Found: 987-654-3210
4. Übereinstimmende Elemente in der Zeichenkette ersetzen
Beispiel
#include <string>
#include <regex>
using namespace std;
int main() {
string text = "Hallo, Welt!";
Regex-Muster("World");
String-Ersetzung = "Universe";
String-Ergebnis = regex_replace(text, pattern, replacement);
cout << "Original: " << text << endl;
cout << "Modified: " << result << endl;
return 0;
}
Ausgabeergebnis:
Original: Hello, World! Modified: Hello, Universe!
Mehr Inhalt
Häufige Klassen und Typen
| Name | Beschreibung |
|---|---|
std::regex |
Kompiliere das Objekt für den regulären Ausdruck |
std::smatch |
std::stringMatch-Ergebnis |
std::cmatch |
C-String-Match-Ergebnisse (const char*) |
std::sregex_iterator |
verwendet fürstd::stringMatch-Iterator |
std::cregex_iterator |
Match-Iterator für C-Strings |
std::syntax_option_type |
Optionen für die Syntax regulärer Ausdrücke |
std::match_flag_type |
Flags zur Steuerung der Übereinstimmung |
Häufig verwendete Funktionen
| Funktionsname | Zweck | Rückgabewert | Beispiel |
|---|---|---|---|
regex_match(s, re) |
Prüfen, ob die gesamte Zeichenkette übereinstimmt | bool |
regex_match("123", re) |
regex_search(s, m, re) |
Die erste Übereinstimmung finden | bool |
regex_search(s, m, re) |
regex_replace(s, re, fmt) |
Übereinstimmungen ersetzen | string |
regex_replace(s, re, "#") |
smatchÜbereinstimmungsergebnis-Objekt
| Mitglied | Beschreibung | Beispiel |
|---|---|---|
m.str() |
Den gesamten übereinstimmenden Inhalt zurückgeben | cout << m.str() |
m[i] |
Die i-te Erfassungsgruppe zurückgeben | m[1].str() |
m.position() |
Startposition der Übereinstimmung | m.position(0) |
m.size() |
Anzahl der Erfassungsgruppen | m.size() |
m.empty() |
Ob die Übereinstimmung leer ist | m.empty() |
Gängige Syntax für reguläre Ausdrücke
| Symbol | Bedeutung | Beispiel | ||
|---|---|---|---|---|
. |
beliebiges Zeichen | a.cTrefferabc |
||
\d |
Zahlen | \d+ |
||
\w |
Alphanumerisch und Unterstrich | \w+ |
||
\s |
Leerraumzeichen | \s+ |
||
^ |
Anfang | ^abc |
||
$ |
end | xyz$ |
||
+ |
1 oder mehrmals | a+ |
||
* |
0 oder mehrmals | a* |
||
? |
0 oder 1 Mal | a? |
||
{n,m} |
n~m Mal | \d{2,4} |
||
() |
erfassende Gruppe | (ab)+ |
||
[] |
Zeichensatz | [A-Z] |
||
| ` | ` | oder | `cat | dog` |
Im C++-Quellcode-String müssen Sie schreiben\\danstelle von\d, weil\maskiert werden muss.
Typische Anwendungsbeispiele
Beispiel
#include <regex>
using namespace std;
int main() {
regex re("\\d+");
string s = "abc123def456";
// Finde die erste Übereinstimmung
smatch m;
if (regex_search(s, m, re))
cout << "Erster Treffer: " << m.str() << endl;
// Über alle Treffer iterieren
for (sregex_iterator it(s.begin(), s.end(), re), end_it; it != end_it; ++it)
cout << "Treffer: " << it->str() << endl;
// Ersetzen
string = regex_replace(s, re, "#");
cout << result⟦⟧endl << endl;
}