im String ersetzen, bin völlig hilflos
-
ich weiss nich wie ich es anstellen soll
mach aus <A> ein <B> und aus <B> ein <A>
AnsiString alt = "Das <A> HAUS <B> IST <A><B> SCHÖN <A>!";
Ergebniss soll sein: "Das <B> HAUS <A> IST <B><A> SCHÖN <B>!";
bitte um hilfe ich hab schon depressionen
-
Hallo
Die grundlegende Funktion dafür ist StringReplace.
Natürlich must du einen Zwischenschritt anwenden:
* Ersetze A durch X (X ist ein von dir gewählter beliebiger String, der nicht mit A oder B identisch ist, und auch nicht in alt vorkommen darf)
* Ersetze B durch A
* Ersetze X durch BAnsonsten must du selbst die Zeichen von alt einzeln durchgehen, einzeln in einen neuen String kopieren und dabei nach den gesuchten A und B Ausschau halten.
bis bald
akari
-
StringBuilder sb = new StringBuilder("Das <A> HAUS <B> IST <A><B> SCHÖN <A>!"); string myString = sb .Replace("<A>", "<X>") .Replace("<B>", "<A>") .Replace("<X>", "<B>") .ToString();
Ich bin mir nur gerade nicht sicher, ob es nicht mit Regex und einem Einzeiler geht
-
dankeschön.
erstmal.
genau das ist ebend das problem welches ich darstellen wollte:
* Ersetze A durch X (X ist ein von dir gewählter beliebiger String, der nicht mit A oder B identisch ist, und auch nicht in alt vorkommen darf)
und daran beiss ich mir die zähne aus, weil es ja sein kann das die zeichenkette auch so aussieht:
AnsiString alt = "Das <A> HAUS <B> IST <A> <X> <B> SCHÖN <A>!";
Ergebniss soll sein: "Das <B> HAUS <A> IST <B> <X> <A> SCHÖN <B>!";
ich muss also anscheinend für das X etwas anderes finden, ein zeichen was nicht in der Zeichenkette vorhanden ist ? und das jedesmal für neue zeichenketten neu generieren ?
-
Hallo
Dann hilft dir keine vorbereitete Funktion. Entweder schaust du, ob dein Builder die schon erwähnten Reguläre Ausdrücke unterstützt. Oder du baust alles selber
Ansonsten must du selbst die Zeichen von alt einzeln durchgehen, einzeln in einen neuen String kopieren und dabei nach den gesuchten A und B Ausschau halten.
@PeterL: Wir sind hier im Builder-Forum. Code bitte in Standard-C++ ohne oder mit VCL schreiben. Mit C# verwirrst du die Leute hier nur.
bis bald
akari
-
ich weiss nich wie man das nennt aber in manchen programmen kann man in Edit Feldern solche Muster einsetzen. zum beispiel beim Totalcommander der hat ein Mehrfach-umbenenn-Tool dort kann man solche Sachen als Dateimaske eingeben.
ich weiss ja nicht wie das umgesetzt wurde aber auf sowas läuft es ja im endefekt hinaus. Auf so eine Art Maske die der user selbst eingibt, und anhand dessen eine Zeichenkette erstellt wird. Sowas wollt ich umsetzen.
kann ich die beispiele hier von PeterL verwenden für sowas, oder muss man das völlig anders machen ?
-
Dies wär eine von duzend möglichen Lösungen.
bool replaceFinished = false; //String festlegen UnicodeString inputString = "Das <A> HAUS <B> IST <A><B> SCHÖN <A>!"; UnicodeString outputString = ""; //Temporäre Variablen für die Bearbeitung int tempPos; int foundPos = -1; int foundElement = -1; UnicodeString tempInput = inputString; //Such und Ersetz-elemente hinzufügen int numReplaces = 2; UnicodeString searchStrings[2] = {"A", "B"}; UnicodeString replaceStrings[2] = {"B", "A"}; do{ //Ermitteln, welcher Suchstring als erstes vorkommt for (int i = 0; i < numReplaces; i++) { tempPos = tempInput.Pos(searchStrings[i]); if (foundPos < 0 || tempPos < foundPos) { foundPos = tempPos; foundElement = i; } } if (foundPos > 0) { //Alles bis zum Fund inkl neuer String übernehmen outputString += tempInput.SubString(0, foundPos - 1) + replaceStrings[foundElement]; //Aus altem String löschen tempInput.Delete(1, foundPos + searchStrings[foundElement].Length() - 1); //Werte zurücksetzen foundPos = -1; foundElement = -1; } else{ //Vorgang abschliessen und Rest übernehmen replaceFinished = true; outputString += tempInput; } }while(!replaceFinished); wcout <<"Eingabestring: " << endl << inputString.c_str() << endl << endl; wcout <<"Ausgabestring: " << endl << outputString.c_str() << endl;
-
Oh sry, dann hier eine eine c++ Lösung
#include <string> #include <iostream> #include "regex" using namespace std;
string test = "Das <A> HAUS <B> IST <A><B> SCHÖN <A>!"; regex reg1("<A>"); regex reg2("<B>"); regex reg3("<X>"); test = regex_replace(test, reg1, "<X>"); test = regex_replace(test, reg2, "<A>"); test = regex_replace(test, reg3, "<B>");
-
Mutti schrieb:
ich weiss nich wie man das nennt aber in manchen programmen kann man in Edit Feldern solche Muster einsetzen. zum beispiel beim Totalcommander der hat ein Mehrfach-umbenenn-Tool dort kann man solche Sachen als Dateimaske eingeben.
ich weiss ja nicht wie das umgesetzt wurde aber auf sowas läuft es ja im endefekt hinaus. Auf so eine Art Maske die der user selbst eingibt, und anhand dessen eine Zeichenkette erstellt wird. Sowas wollt ich umsetzen.
kann ich die beispiele hier von PeterL verwenden für sowas, oder muss man das völlig anders machen ?
Klar kannst du das verwenden, darum wird es dir ja gepostet
-
vielen dank für den guten code.
-
hab ma den Code so umgebaut das alles korrekt funktioniert
bool replaceFinished = false; //String festlegen UnicodeString inputString = "Das <A> HAUS <B> IST <A> <C> <B> SCHÖN <A>X"; UnicodeString outputString = ""; //Temporäre Variablen für die Bearbeitung int tempPos; int foundPos = -1; int foundElement = -1; UnicodeString tempInput = inputString; //Such und Ersetz-elemente hinzufügen int numReplaces = 3; UnicodeString searchStrings[] = {"<A>", "<B>", "X"}; UnicodeString replaceStrings[] = {"<Z>", "<X>", "!"}; foundPos = tempInput.Length()+1; do{ //Ermitteln, welcher Suchstring als erstes vorkommt for (int i = 0; i < numReplaces; i++) { tempPos = tempInput.Pos(searchStrings[i]); if(tempPos < foundPos && tempPos > 0) { foundPos = tempPos; //Aktueller fund foundElement = i; } } if (foundElement > -1) { //Alles bis zum Fund inkl neuer String übernehmen outputString += tempInput.SubString(0, foundPos - 1) + replaceStrings[foundElement]; //Aus altem String löschen tempInput.Delete(1, foundPos + searchStrings[foundElement].Length() -1); //Werte zurücksetzen foundPos = tempInput.Length()+1; foundElement = -1; } else { //Vorgang abschliessen und Rest übernehmen replaceFinished = true; outputString += tempInput; } } while(!replaceFinished); wcout <<"Eingabestring: " << endl << inputString.c_str() << endl << endl; wcout <<"Ausgabestring: " << endl << outputString.c_str() << endl;
-
Hallo Leute,
wenn ich das Problem richtig verstanden habe, dann sollen nur einige "Wörter" vertauscht werden, oder?
Was spricht gegen diesen Ansatz?
String tempstr="Das <A> HAUS <B> IST <A> <C> <B> SCHÖN <A>X"; tempstr=StringReplace(tempstr,"<A>","<A1>",TReplaceFlags()<<rfReplaceAll); tempstr=StringReplace(tempstr,"<B>","<B1>",TReplaceFlags()<<rfReplaceAll); tempstr=StringReplace(tempstr,"<B1>","<A>",TReplaceFlags()<<rfReplaceAll); tempstr=StringReplace(tempstr,"<A1>","<B>",TReplaceFlags()<<rfReplaceAll); Edit2->Text=tempstr;
Gruß
Hawk
-
Genau die Tatsache, welche Mutti schon zu Beginn mal angesprochen hat.
Denn es könnte sein, dass A1 bereits im zu ersetzenden Text vorkommt.Dieses wird dann in einem zweiten Schritt ebenfalls ersetzt, was ungewünscht wäre.
Diese Methode funktioniert nur mit einer Zeichenfolge, bei welcher man sicher gehen kann, dass diese noch nicht vorkommt.