Reguläre Ausdrücke in C++: Ein leistungsstarkes Werkzeug für die Arbeit mit Zeichenketten
Reguläre Ausdrücke (regex) sind eine formale Sprache zum Suchen und Manipulieren von Teilzeichenketten in Text auf der Grundlage von Mustern. In C++ wurde die Unterstützung für reguläre Ausdrücke im Standard C++11 eingeführt und ist in der Bibliothek <regex> implementiert. Dies ist ein unverzichtbares Werkzeug für die Datenvalidierung, das Parsen von Logs, die Mustersuche und die Textersetzung.
In diesem Artikel werden wir die wichtigsten Funktionen der Bibliothek regex analysieren, lernen, wie man Muster erstellt, und praktische Beispiele mit Code betrachten.
1. Grundlegende Typen und Funktionen der Bibliothek <regex>
Für die Arbeit mit regulären Ausdrücken in C++ werden drei Hauptklassen verwendet:
std::regex— repräsentiert den regulären Ausdruck selbst (das Muster).std::smatch— Container zum Speichern von Suchergebnissen (für Zeichenketten vom Typstd::string).std::cmatch— Analog für C-Zeichenketten (const char*).
Wichtige Funktionen zur Anwendung von regex:
std::regex_match()— prüft, ob die gesamte Zeichenkette dem Muster entspricht.std::regex_search()— sucht nach der ersten Übereinstimmung mit dem Muster in der Zeichenkette.std::regex_replace()— ersetzt alle Übereinstimmungen durch den angegebenen Text.
#include <iostream>#include <regex>#include <string>
int main() { std::string text = "Meine Nummer: +7-123-456-78-90"; std::regex pattern(R"(\\+7-\\d{3}-\\d{3}-\\d{2}-\\d{2})");
if (std::regex_search(text, pattern)) { std::cout << "Nummer gefunden!" << std::endl; }
// Übereinstimmung extrahieren std::smatch match; if (std::regex_search(text, match, pattern)) { std::cout << "Gefundene Nummer: " << match[0] << std::endl; }
return 0;}2. Syntax regulärer Ausdrücke: Metazeichen und Quantoren
Regex-Muster in C++ verwenden eine Syntax, die ECMAScript ähnelt (standardmäßig). Hier sind die grundlegenden Elemente:
- Punkt (.) — ein beliebiges einzelnes Zeichen, außer Zeilenumbruch.
- Sternchen (*) — 0 oder mehr Wiederholungen des vorherigen Zeichens.
- Plus (+) — 1 oder mehr Wiederholungen.
- Fragezeichen (?) — 0 oder 1 Wiederholung (macht das Zeichen optional).
- Eckige Klammern ([]) — Zeichenklasse (z.B.
[0-9]— eine beliebige Ziffer). - Runde Klammern (()) — Gruppierung und Erfassung von Teilzeichenketten.
- Senkrechter Strich (|) — logisches ODER.
- Zeichen ^ — Zeilenanfang.
- Zeichen $ — Zeilenende.
Beispiele für Quantoren:
\\d{3}— genau 3 Ziffern.\\w{2,4}— 2 bis 4 alphanumerische Zeichen.[A-Za-z]+— ein oder mehr lateinische Buchstaben.
#include <iostream>#include <regex>#include <string>
int main() { std::string email = "user@example.com"; // Einfaches Muster für email std::regex email_pattern(R"([\\w.+-]+@[\\w-]+\\.[\\w.]+)");
if (std::regex_match(email, email_pattern)) { std::cout << "Email ist korrekt." << std::endl; } else { std::cout << "Email ist nicht korrekt." << std::endl; }
// Überprüfung der Telefonnummer std::string phone = "+7 (495) 123-45-67"; std::regex phone_pattern(R"(\\+7\\s?\\(?\\d{3}\\)?\\s?\\d{3}-?\\d{2}-?\\d{2})");
if (std::regex_match(phone, phone_pattern)) { std::cout << "Telefonnummer ist korrekt." << std::endl; }
return 0;}3. Datenextraktion mit Erfassungsgruppen
Erfassungsgruppen