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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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;
}
Weitere Erweiterungen