Im dritten Beitrag zu regulären Ausdrücken in C++ befassen wir uns mit der Methode regex_replace. Mit dieser Methode können gefundene Ausdrücke durch beliebige andere Ausdrücke ersetzt werden. Zur Verwendung der Beispiele definieren wir zuerst die notwendigen Headerdateien.
1 2 3 4 |
//Header einbinden #include <iostream> //std::cout #include <string> //std::string #include <regex> //std::regex |
In unserem ersten Beispiel haben wir einen String, der drei verschiedene Versionen eines Nachnamens enthält. Wir wollen alle Instanzen von „Mayer“ und „Maier“ finden und durch „Meier“ ersetzen. Dazu definieren wir den entsprechenden regulären Ausdruck mit drei Gruppen. Anschließend übergeben wir den Suchstring (search1
), die Grammatik (reg1
) und den Ersatzausdruck ("Meier"
) an regex_replace. Danach geben wir sowohl unseren Originalstring (result1
) als auch das Ergebnis der Ersetzung (result1
) aus.
1 2 3 4 5 6 7 8 |
// einfache Verwendung std::string search1("Heinz Meier, Klaus Mayer, Norbert Maier"); std::regex reg1(R"((M)(ai|ay)(er))"); std::string result1 = std::regex_replace(search1, reg1, "Meier"); std::cout << "Original: " << search1 << '\n'; std::cout << "Ergebnis: " << result1 << '\n'; |
Original: Heinz Meier, Klaus Mayer, Norbert Maier
Ergebnis: Heinz Meier, Klaus Meier, Norbert Meier
Wir erkennen, dass alle Varianten des Namens gefunden und entsprechend ersetzt wurden.
Für unser nächstes Beispiel verwenden wir die Iteratormethode. In diesem Fall wollen wir Wörter mit „ß“ durch die Buchstaben „sz“ ersetzen. In der Replace Funktion definieren wir zuerst, dass der neue String an das Ende von result2
angehängt werden soll (back_inserter
). Anschließend übergeben wir Iteratoren auf den Beginn (search2.begin()
) und das Ende (search2.end()
) des Suchstrings (search2
). Des Weiteren Übergeben wir den regulären Ausdruck (reg2
) und den Ersatzausdruck ("sz"
).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Verwendung mit Iterator std::string search2("Straße, Strauß, Grieß"); std::regex reg2(R"((ß))"); std::string result2 = "Ergebnis: "; std::regex_replace(std::back_inserter(result2), search2.begin(), search2.end(), reg2, "sz"); std::cout << "Original: " << search2 << '\n'; std::cout << result2 << '\n'; |
Original: Straße, Strauß, Grieß
Ergebnis: Strasze, Strausz, Griesz
Wir erkennen im Ergebnis, dass der neue String tatsächlich an das Ende von result2 angehängt wurde.
Für unser letztes Beispiel definieren wir zur einfacheren Verwendung von regex_replace die Funktion replaceString()
. Diese Funktion kann mit den schon bekannten Parametern aufgerufen werden. Optional kann zusätzlich ein Flag übergeben werden, das die Ausführung von regex_replace modifiziert. In unserem ersten Aufruf verwenden wir die Option format_first_only
. Damit wird der Vorgang nach der ersten Ersetzung beendet. Im zweiten Aufruf verzichten wir auf die Übergabe eines Flags. Nun kommt der Default Wert aus unserer Funktionsdefinition zur Anwendung (match_default
). Eine Übersicht über alle Flags kann unter diesem Link gefunden werden.
1 2 3 4 5 6 7 8 9 10 11 12 |
// "str" durchsuchen nach "expr" und gefundene Ausdrücke ersetzen durch "replace" // Optional Suchparameter mit "flags" verändern void replaceString(const std::string& str, const std::regex& expr, const std::string& replace, std::regex_constants::match_flag_type flags = std::regex_constants::match_default ) { std::cout << "Original: " << str << '\n'; std::cout << "Ergebnis: " << std::regex_replace(str, expr, replace, flags) << '\n'; } |
1 2 3 |
// Verwendung mit Funktion und Option replaceString("1, 2, 3, 4, 5", std::regex(R"(([2-3]))"), "X", std::regex_constants::format_first_only); replaceString("1, 2, 3, 4, 5", std::regex(R"(([2-3]))"), "X"); |
Original: 1, 2, 3, 4, 5
Ergebnis: 1, X, 3, 4, 5
Original: 1, 2, 3, 4, 5
Ergebnis: 1, X, X, 4, 5
Die Ausgabe zeigt für den ersten Fall aufgrund des Flags nur eine Ersetzung der Ziffer 2. Beim zweiten Fall wurden alle, dem regulären Ausdruck entsprechenden Ziffern, ersetzt.
Das Beispiel kann mit folgendem Befehl übersetzt und ausgeführt werden:
g++ -std=c++11 cpp_regex_replace.cpp && ./a.out
Das komplette Beispiel herunterladen: cpp_regex_replace.zip
Hinterlasse jetzt einen Kommentar