String zwischen bestimmten Zeichen ausschneiden?



  • Ich habe folgenden string:

    "Das ist ein [b]$bla$[/b] naja wie gehts dir [b]$xyz$[/b]. Der [b]$bla$[/b] ist [b]%XXX%[/b]."
    

    Jetzt sieht man die dick beschrifteten wörter, diese sind variablen welche definiert wurden:

    bla=Test
    xyz=Ops
    XXX=fertig
    

    Jetzt such ich eine Möglichkeit diese String zwischen den ...... Zeichen zu filtern/ausschneiden.
    Hab auch schon hierfür eine gute Funktion gefunden:

    vector<std::string> split(string const& str, string const& sep)
    {
        vector<string> ret;
        string::size_type last = 0;
        string::size_type i;
    
        while ((i = str.find(sep, last)) != string::npos) 
    	{
            ret.push_back(str.substr(last, i - last));
            last = i + 1;
        }
    
        ret.push_back(str.substr(last));
        return ret;
    }
    

    Diese Funktion teilt aber strings ab einem bestimmten Zeichen, kann mir jemand bitte diese Fkt. erweitern so dass zwischen den Zeichen $$ das Wort zurückgegeben wird.



  • versuche es zu verstehen und machs selber



  • Ich bitte euch nur die Funktion split zu erweitern, den Rest mach ich schon.



  • Was willst du denn haben? Willst du das die Variablen durch die richtigen Werte ersetzt werden oder einfach nur die Variablen namen haben?



  • Nur die Variablen Namen, diese werden dann weiterverarbeitet



  • kernel64 schrieb:

    Diese Funktion teilt aber strings ab einem bestimmten Zeichen, kann mir jemand bitte diese Fkt. erweitern so dass zwischen den Zeichen $$ das Wort zurückgegeben wird.

    Huh? Die Funktion macht doch (fast) genau was du willst*: alle ungeraden Elemente sind deine Variablennamen.

    *sogar obwohl sie falsch ist - such im Forum nach "split" oder "explode", das gab's schon öfter, und falls du sowieso boost verwendest oder dich damit anfreunden kannst, nimm Boost String Algorithms.



  • @finix: Wieso ist die Funktion falsch? Hab die Funktion aus diesem Forum, naja welche Zeile soll ich verändern damit es funktioniert?



  • last = i + sep.length() statt +1 .



  • Hab das so gemacht:

    #include <windows.h> 
    #include <vector>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //Funktion soll strings zwischen bestimmten Zeichen zurückgeben.
    vector<std::string> splitEx(string const& str, string const& sep)
    {
        vector<string> ret;
        string::size_type last = 0;
        string::size_type i;
    
        while ((i = str.find(sep, last)) != string::npos) 
    	{
            ret.push_back(str.substr(last, i - last));
            last = i + sep.length();
        }
    
        ret.push_back(str.substr(last));
        return ret;
    }
    
    int main()
    {
    	string str = "hallo $MAMA$ wie gehts dir $XXX$ naja $BLA$";
    
    	vector<string> token = splitEx(str, "$");
    
    	for(int i = 0; i < token.size(); i++)
    	{
    		cout << token[i] << endl;
    	}
    
    	system("pause");		
    	return 0;
    }
    

    Wenn jetzt der string str an die Funktion übergeben wird müssten die strings MAMA, XXX, BLA zurückgegeben werden, aber die Funktion gibt alle strings zurück:

    hallo
    MAMA
     wie gehts dir
    XXX
     naja
    BLA
    

    Die Funktion gibt ja alle strings zurück die sich zwischen den Zeichen $$ befinden, d.h. die strings die nicht relevant sind wie "naja" oder "wie gehts dir" werden auch zurückgegeben das soll aber nciht passieren.

    Wie soll der Funktion dies klar gemacht werden?



  • Was du machst geht auch nicht. Du suchst immer nur nach dem Zeichen und nimmst dann den String der vor diesem Zeichen steht bzw. zwischen dem aktuellen 'unddemzuletztgefundenen' und dem zuletzt gefundenen '' steht. Was du willst geht so:

    vector<std::string> splitEx(string const& str, string const& sep)  { 
    	vector<string> ret;
    	size_t first = str.find(sep);
    	size_t second = 0;
    
    	while((second = str.find(sep, first+sep.length())) != string::npos) {
    		ret.push_back(str.substr(first+1, second-first-1));
    		if(second+sep.length()>=str.length()) break;
    		first = str.find(sep, second+sep.length());
    	}
    
    	return ret;
    }
    

    Erstmal suche ich nach dem Separator und initialisiere first auch gleich damit. Anschließend suche ich nach dem zweiten Separator und pack diesen Wert in den second. Anschließend wird der Wert dazwischen gespeichert. Wenn dann noch Platz für weitere Separatoren sein könnte wird nach dem nächsten gesucht und wieder in first gespeichert. Das läuft dann so lange bis es keine Separator-Paare mehr gibt.

    Das sollte denke ich sein was du suchst.

    Greetz



  • Vielen Dank 🙂 👍


Anmelden zum Antworten