2016-04-02 5 views
0

ich Strings in einem String ersetzen wollen, Für zB: die Zeichenfolge aa0_a a1_b b3_c * a0_a, so möchte ich die Teil a0_a mit b1_a ersetzen, aber ich nicht will, dass aa0_a ersetzt wird. Grundsätzlich sollte vor und nach dem Teilstring "a0_a" (zu ersetzendes Zeichen) kein Alphabet vorhanden sein.Teilzeichenfolge Ersetzen innerhalb einer Zeichenkette C++

+1

Mögliches Duplikat [Teil einer Zeichenfolge durch eine andere Zeichenfolge ersetzen] (http: // stackoverflow.com/questions/3418231/replace-part-of-a-string-with-another-string) –

+0

Siehe diesen Link http://www.cplusplus.com/reference/string/string/replace/ – Shiv

Antwort

3

Das ist, was Regexes gut sind. Es existiert in der Standardbibliothek seit C++ 11, wenn Sie eine ältere Version haben, können Sie auch Boost verwenden.

Mit der Standard-Version der Bibliothek, könnten Sie tun (ref):

std::string result; 
std::regex rx("([^A-Za-Z])a0_a[^A-Za-Z])"); 
result = std::regex_replace("aa0_aa1_bb3_c*a0_a", rx, "$1b1_a$2"); 

(Vorsicht: nicht getestet)

+0

Danke, es funktioniert, nur die Sache ist, dass $ 1 den gesamten RX-Teilstring druckt, während wir nur das erste Zeichen des Teilstrings wollen – user2665673

+0

Die Strings durch Klammern zu trennen tat dies .. ([^ A-Za-z]) (a0_a) .. Regex trennt dies in 2 Teile .. so $ 1 wird nur den ersten Teil nehmen, dh [^ A-Za-z] – user2665673

0

Einfach genug zu tun, wenn Sie jedes Zeichen durchlaufen. Einige Pseudocode:

Beachten Sie, dass Sie bei der Suche auf die Teilstrings auf Indexierung außerhalb der Grenzen überprüfen müssen.

+0

Ja, das würde für kleine Saiten arbeiten, aber ich würde diese Operation viele Male machen, Iterieren über jedes Zeichen einer Zeichenfolge wird langweilig sein ..... – user2665673

+0

Also, jedes Mal, wenn wir nach dem Teilstring suchen können, dann prüfen Sie das Zeichen an der Position (Index-1), um ein Alphabet zu sein ... gibt es einen schnelleren Weg, wie ich bis jetzt Boost verwendet: : replace_all, möchte eine ähnliche Funktion, die diese Bedingung auch berücksichtigen kann – user2665673