Wie kann ich einen Teilstring in einem String durch einen anderen Teilstring in C ++ ersetzen? Welche Funktionen kann ich verwenden?
eg: string test = "abc def abc def";
test.replace("abc", "hij").replace("def", "klm"); //replace occurrence of abc and def with other substring
Antworten:
In C ++ ist hierfür keine Funktion integriert. Wenn Sie alle Instanzen eines Teilstrings durch einen anderen ersetzen möchten, können Sie dies tun, indem Sie Aufrufe an
string::find
und mischenstring::replace
. Beispielsweise:In der letzten Zeile dieses Codes habe ich
index
um die Länge der Zeichenfolge erhöht , die in die Zeichenfolge eingefügt wurde. In diesem speziellen Beispiel - Ersetzen"abc"
durch"def"
- ist dies eigentlich nicht erforderlich. In einer allgemeineren Einstellung ist es jedoch wichtig, die gerade ersetzte Zeichenfolge zu überspringen. Zum Beispiel, wenn Sie ersetzen möchten"abc"
mit"abcabc"
, ohne das Überspringen neu ersetzt String - Segment, würde dieser Code kontinuierlich Teile der neu ersetzt Strings ersetzen , bis der Speicher erschöpft war. Unabhängig davon kann es ohnehin etwas schneller sein, diese neuen Zeichen zu überspringen, da diestring::find
Funktion dadurch Zeit und Mühe spart .Hoffe das hilft!
quelle
index
) über den Teil der Zeichenfolge hinaus verschoben wird , der ersetzt wurde.Boost String Algorithms Library Weg:
quelle
Im c ++ 11können Sie verwenden
std::regex_replace
:quelle
Ich denke, alle Lösungen schlagen fehl, wenn sich die Länge der ersetzenden Zeichenfolge von der Länge der zu ersetzenden Zeichenfolge unterscheidet. (Suche nach "abc" und ersetze durch "xxxxxx") Ein allgemeiner Ansatz könnte sein:
quelle
Wo
str
ist die Basiszeichenfolgestr2
ist die zu findende Unterzeichenfolgestr3
ist der Ersatz-Teilstringquelle
Das Ersetzen von Teilzeichenfolgen sollte nicht so schwierig sein.
Wenn Sie Leistung benötigen, finden Sie hier eine optimierte Funktion, mit der die Eingabezeichenfolge geändert und keine Kopie der Zeichenfolge erstellt wird:
Tests:
Ausgabe:
quelle
if (search.empty()) { return; }
um eine Endlosschleife zu vermeiden, wenn die leere 'Suche' übergeben wird.Da es kein Mitglied der
string
Klasse ist, erlaubt es keine ganz so schöne Syntax wie in Ihrem Beispiel, aber das Folgende wird das Äquivalent tun:quelle
Verallgemeinernd auf die Antwort von rotmax finden Sie hier eine vollständige Lösung zum Suchen und Ersetzen aller Instanzen in einer Zeichenfolge. Wenn beide Teilzeichenfolgen unterschiedlich groß sind, wird die Teilzeichenfolge mit string :: erase und string :: insert ersetzt. Andernfalls wird die schnellere Zeichenfolge :: replace verwendet.
quelle
Wenn Sie sicher sind, dass der erforderliche Teilstring in der Zeichenfolge vorhanden ist, ersetzt dies das erste Auftreten von
"abc"
to"hij"
Es wird abstürzen, wenn Sie nicht "abc" im Test haben, also verwenden Sie es mit Vorsicht.
quelle
Hier ist eine Lösung, die ich mit der Builder-Taktik geschrieben habe:
Tests:
quelle
Ich denke, das passt zu Ihrer Anforderung mit wenig Code!
quelle
die geliebte Version von @Czarek Tomczak.
erlaube beides
std::string
undstd::wstring
.quelle
quelle
Hier ist eine Lösung mit Rekursion, die alle Vorkommen eines Teilstrings durch einen anderen Teilstring ersetzt. Dies funktioniert unabhängig von der Größe der Zeichenfolgen.
Anwendungsbeispiel:
quelle
Kurze Lösung, bei der Sie keine zusätzlichen Bibliotheken benötigen.
quelle
quelle