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 B

    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.

    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.


Anmelden zum Antworten