C++ replace

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.