String zwischen 2 anderen Strings



  • heyho!
    kennt jemand eine Funktion, mit der ich einen String zwischen zwei anderen anderen Strings raussuchen kann.
    Nach dem Motto:

    string mystring = "<img>heyho</img>";
    string start = "<img>";
    string ende = "</img>";
    string ergebnis = Stringbetween(mystring,start, ende); // das ergebnis sollte //'heyho' sein
    

    mfg
    @night@



  • wenn du evtl eindeutige trenner nehmen könntest kannste mit string.find() das zeichen von anfang an suchen mit und mit string.rfind() nach dem letzen vorkommen des Zeichens suchen und dann schneiden.
    Obwohl es ja so geht bei dir . Erste zeichen wäre > und letzte wäre <
    wenn ich mich nicht täusche.

    vieleicht hilft die das weiter besonder die erste Seite. Mir half sie 🙂
    http://www.mathematik.uni-muenchen.de/~spann/vorlesungen/c++/ws09/inf4.pdf

    mfg Michael



  • Die Methode substr von einem string?



  • und dann schneiden.

    Wie schneiden 😕



  • substr schreibt doch entweder ab einen punkt den Rest oder ab einen Punkt eine bestimmte anzahl von zeichen.
    Wenn er das in vorfeld immer weis kann er das ja auch so machen, Ich würde aber wohl eher rausfiltern.

    mfg Michael



  • if (bufferstring.find("ICY-META") != string::npos)
                 {
                  big_string = bufferstring.size(); // größe ermitteln
                  pos_one = bufferstring.find("'"); // estes zeichen finden position ermitten
                  bufferstring.erase(0,pos_one + 1); // Abschneiden teil string von vorne
                  pos_two = bufferstring.find(";"); // zweites zeichen suchen 
                  bufferstring.erase(pos_two - 1);  // rest abschneiden
                  pthread_mutex_lock (&radiomutex);
                  interpret_title = bufferstring;
                  pthread_mutex_unlock (&radiomutex);
                 }
    

    hier mal ein beispiel der einen aus einem stream den titel rausgibt der stream sieht so aus

    @I ICY-META: StreamTitle='RAMMSTEIN - DU RIECHST SO GUT';StreamUrl='http://www.dieneue1077.de';
    

    und das ergebnis so

    RAMMSTEIN - DU RIECHST SO GUT
    

    es kann der string immer unterschiedlich lang sein es wird passend geschnitten
    habe mal den code nacherklärt

    mfg Michael



  • #include <iostream>
    #include <string>
    
    std::string StringBetween(const std::string& input, const std::string& left, const std::string& right)
    {
    	size_t posLeft, posRight;
    
    	posLeft = input.find(left);
    	posRight = input.find(right);
    
    	if (posLeft == std::string::npos || posRight == std::string::npos)
    	{
    		return ""; // Nicht gefunden
    	}
    
    	posLeft += left.length();
    
    	return input.substr(posLeft, input.length() - right.length() - left.length());
    }
    
    int main()
    {
    	std::cout << "'" << StringBetween("<img>The image stuff...</img>", "<img>", "</img>") << "'" << std::endl;
    
    	return 0;
    }
    


  • es gibt da noch ein Problem...

    string mystring = "<img>heyho</img>irgendeintext";
        string ergebnis = StringBetween(mystring, "<img>", "</img>");
        cout << ergebnis << endl;
        system("pause");
    

    Der Rückgabewert ist: heyho</img>irgendeintext
    Irgendwas ist da falsch...
    mfg
    @night@



  • uuuuuuuuuuuuuuuu schrieb:

    #include <iostream>
    #include <string>
    
    std::string StringBetween(const std::string& input, const std::string& left, const std::string& right)
    {
    	size_t posLeft, posRight;
    
    	posLeft = input.find(left);
    	posRight = input.find(right);
    
    	if (posLeft == std::string::npos || posRight == std::string::npos)
    	{
    		return ""; // Nicht gefunden
    	}
    
    	posLeft += left.length();
    
    	return input.substr(posLeft, input.length() - right.length() - left.length());
    }
    
    int main()
    {
    	std::cout << "'" << StringBetween("<img>The image stuff...</img>", "<img>", "</img>") << "'" << std::endl;
    
    	return 0;
    }
    

    Du hast das posRight nicht verarbeitet. Und was ist, wenn posRight < posLeft ist? Also z. B. in "</img>foo<img>".

    Auf der anderen Seite hat @night@ ja jetzt den Ansatz. Das Bugfixing sollte nicht mehr so schwer sein.



  • heyho.
    ich hab jetzt mal versucht posRight negativ abzutrennen.

    string ergebnis2 = ergebnis1.substr((-posRight), 1);
    

    Nur mal so zum probieren. Die idde hab ich von hier(1.Link-->aus irgendeinem Grund kann man das net verlinken -.-)
    Aber auf diese Weise stürzt entweder das Programm ab, oder der Compiler will den Code nicht kompillieren...
    Gibt es noch iregendeine Möglichkeit von der anderen Seite des Strings Buchstaben abzuschneiden???
    mfg
    @night@



  • ich habs jetzt hingekriegt...

    string StringBetween(const string& input, const string& left, const string& right)
    {
        size_t posLeft, posRight;
    
        posLeft = input.find(left);
        posRight = input.find(right);
    
        if (posLeft == string::npos || posRight == string::npos)
        {
            return ""; // Nicht gefunden
        }
    
        posLeft += left.length();
        posRight += right.length();
        string ergebnis1 = input.substr(posLeft, input.length() - right.length() - left.length());
        int formel = (input.find(right) - posLeft);
        string ergebnis2 = ergebnis1.substr(0, formel);
        return ergebnis2;
    }
    

    mfg
    @night@



  • string string_to_cut (string bufferstring , string begin , string end , int number_of_a , int number_of_b)
          {
           int big_string , pos_one , pos_two;
           big_string = bufferstring.size();
           if (bufferstring.find(begin) != string::npos)
             {pos_one = bufferstring.find(begin);bufferstring.erase(0,pos_one+number_of_a);}
           else {bufferstring.erase(); errorwrite("string begin","string_to_cut");}
           if (bufferstring.find(end) != string::npos)
             {pos_two = bufferstring.find(end);bufferstring.erase(pos_two-number_of_b);}
           else {bufferstring.erase(); errorwrite("string end","string_to_cut");}
           begin.erase();
           end.erase();
           return bufferstring;
          }
    

    spricht doch auch nichts gegen oder ?
    klappt zumindest


Anmelden zum Antworten