Eingabe mit cin >> eingabe ist problematisch für längere Texte
Die Verwendung von cin >> eingabe liest nur bis zum ersten Leerzeichen. Wenn du einen ganzen Satz oder längeren Text einlesen möchtest, solltest du stattdessen std::getline verwenden:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
string eingabe;
cout << "Bitte den englischen Text eingeben: ";
getline(cin, eingabe); // Ganze Zeile einlesen
string ausgabe;
ausgabe = std::regex_replace(eingabe, std::regex("sc"), "fM"); // Ersetzen von "sc" durch "fM"
cout << "Übersetzung: " << ausgabe << endl; // Ausgabe der Übersetzung
return 0;
}
Die Syntax von std::regex_replace
in C++ hängt davon ab, ob du mit Strings oder Iteratoren arbeitest. Hier sind die wichtigsten Varianten:
1. Mit einem String als Eingabe
Diese Variante ersetzt alle Vorkommen eines regulären Ausdrucks in einem String und gibt den modifizierten String zurück.
Syntax:
std::string regex_replace( const std::string& str,
const std::regex& rgx,
const std::string& fmt,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default
);
Parameter:
str
: Der Eingabestring.rgx
: Der reguläre Ausdruck, der die zu ersetzenden Muster definiert.fmt
: Der Ersatzstring (kann Platzhalter wie$1
für Capture Groups enthalten).flags
: Optional; steuert das Verhalten der Ersetzung (z. B.std::regex_constants::format_first_only
für nur die erste Übereinstimmung).
Beispiel:
include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "The quick brown fox jumps over the lazy dog.";
std::regex pattern("fox");
std::string replacement = "cat";
std::string result = std::regex_replace(text, pattern, replacement);
std::cout << result; // Ausgabe: "The quick brown cat jumps over the lazy dog."
return 0;
}
2. Mit Iteratoren für große Datenmengen
Diese Variante arbeitet direkt mit Iteratoren und schreibt die Ergebnisse in einen Ausgabestream oder Container.
Syntax:
template <class OutIt, class BidIt>
OutIt regex_replace(
OutIt out,
BidIt first,
BidIt last,
const std::regex& rgx,
const std::string& fmt,
std::regex_constants::match_flag_type flags = std::regex_constants::match_default
);
- Parameter:
out
: Der Iterator, an den die Ergebnisse geschrieben werden.first
,last
: Anfang und Ende des Eingabebereichs.rgx
,fmt
,flags
: Wie oben.
Beispiel:
#include <iostream>
#include <regex>
#include <iterator>
#include <string>
int main() {
std::string text = "there is a subsequence in the string";
std::regex pattern("\\b(sub)([^ ]*)");
std::string replacement = "sub-$2";
std::string result;
std::regex_replace(std::back_inserter(result), text.begin(), text.end(), pattern, replacement);
std::cout << result; // Ausgabe: "there is a sub-sequence in the string"
return 0;
}
3. Verwendung von Flags
Mit Flags kannst du das Verhalten der Ersetzung anpassen:
std::regex_constants::format_first_only
: Ersetzt nur die erste Übereinstimmung.std::regex_constants::format_no_copy
: Kopiert nur die Übereinstimmungen und ignoriert den Rest des Strings.
Beispiel mit Flags:
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string text = "abc def ghi";
std::regex pattern("abc|def");
// Ersetzt nur die erste Übereinstimmung
std::string result = std::regex_replace(text, pattern, "XYZ", std::regex_constants::format_first_only);
std::cout << result; // Ausgabe: "XYZ def ghi"
return 0;
}
Zusammenfassung
Die Funktion std::regex_replace
ist äußerst flexibel:
- Für einfache Ersetzungen kannst du direkt mit Strings arbeiten.
- Für größere Datenmengen oder Streams sind Iteratoren besser geeignet.
- Mit Flags kannst du das Verhalten feinjustieren.