Reguläre Ausdrücke in C++: Ein leistungsstarkes Werkzeug für die Textverarbeitung
Reguläre Ausdrücke (regex) sind ein äußerst leistungsstarkes Werkzeug zum Suchen, Extrahieren und Ersetzen von Textfragmenten nach einem bestimmten Muster. In C++ wurde die Unterstützung für reguläre Ausdrücke mit dem Standard C++11 eingeführt und ist in der Header-Datei <regex> implementiert. In diesem Artikel werden wir im Detail anhand praktischer Beispiele erläutern, wie man reguläre Ausdrücke in C++ verwendet.
Hauptkomponenten der Bibliothek <regex>
Die Bibliothek <regex> enthält mehrere Schlüsselklassen und -funktionen:
std::regex— eine Klasse, die einen kompilierten regulären Ausdruck darstellt.std::smatch— ein Container zum Speichern von Suchergebnissen (für Zeichenketten vom Typstd::string).std::regex_match— prüft, ob die gesamte Zeichenkette dem Muster entspricht.std::regex_search— sucht nach dem ersten Vorkommen des Musters in der Zeichenkette.std::regex_replace— ersetzt Übereinstimmungen durch den angegebenen Text.
Betrachten wir jede dieser Komponenten anhand von Beispielen.
Beispiel 1: Prüfen, ob eine Zeichenkette einem Muster entspricht (regex_match)
Die Funktion std::regex_match gibt true zurück, wenn die gesamte Zeichenkette vollständig dem regulären Ausdruck entspricht. Dies ist ideal für die Datenvalidierung, z. B. zum Prüfen einer E-Mail oder Telefonnummer.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Muster zum Prüfen einer E-Mail (vereinfacht) std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})"); if (std::regex_match(email, pattern)) { std::cout << "E-Mail ist gültig." << std::endl; } else { std::cout << "E-Mail ist ungültig." << std::endl; } // Beispiel mit einer ungültigen E-Mail std::string bad_email = "user@.com"; if (std::regex_match(bad_email, pattern)) { std::cout << "E-Mail ist gültig." << std::endl; } else { std::cout << "E-Mail ist ungültig." << std::endl; } return 0;}In diesem Beispiel haben wir einen Raw-String R"(...)" verwendet, um das Escapen von Backslashes zu vermeiden. Das Muster prüft, ob die Zeichenkette einen lokalen Teil, das @-Zeichen, einen Domainnamen und eine Top-Level-Domain enthält.
Beispiel 2: Suchen einer Teilzeichenkette im Text (regex_search)
Wenn das erste Vorkommen eines Musters innerhalb einer Zeichenkette gefunden werden soll, wird std::regex_search verwendet. Die Ergebnisse werden in einem Objekt vom Typ std::smatch gespeichert.
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "Meine Telefonnummer: +7 (123) 456-78-90. Rufen Sie mich an!"; // Muster zum Suchen einer russischen Telefonnummer std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}[- ]?\\d{2}[- ]?\\d{2})"); std::smatch match; if (std::regex_search(text, match, phone_pattern)) { std::cout << "Gefundene Nummer: " << match.str() << std::endl; std::cout << "Position: " << match.position() << std::endl; } else { std::cout << "Keine Nummer gefunden." << std::endl; } return 0;}Das Objekt match enthält nicht nur die gefundene Zeichenkette, sondern auch Informationen über die Position des Vorkommens. Die Methode match.str() gibt das gefundene Fragment zurück, und match.position() gibt den Index des Beginns der Übereinstimmung in der ursprünglichen Zeichenkette zurück.
Beispiel 3: Textersetzung mit regex_replace
Die Funktion std::regex_replace ersetzt alle Vorkommen eines Musters durch die angegebene Zeichenkette. Es können Rückverweise (backrefer