Mit Regex nach 2 Keywörtern suchen und die Zeichen dazwischen ausgeben



  • Hallo
    Ich habe folgende Funktion geschrieben:

    string datei_durchsuchen( const string& DATEIINHALT, const boost::regex& e) 
    { 
        string res[2]; 
        boost::match_results< string::const_iterator > what; 
    	if( boost::regex_search( DATEIINHALT.begin(), DATEIINHALT.end(), what, e ) ) 
        { 
            // what[0] enthält den gesamten Ausdruck 
            res[0] = what[1];   // 1. Gruppe
            res[1] = what[2];   // 2. Gruppe                  
        } 
        return res[0]+res[1]; 
    }
    

    Diese Funktion sucht nach einem bestimmten keyword und gibt das Wort danach aus. Ich wollte aber jetztz eine Funktion schreiben, die nach 2 Keywörtern sucht und die Wörter/Zeichen danach ausgibt. Wie kann ich das realisieren? mir fehlt momentan einfach der Ansatz.



  • Ich meinte natürlich, er soll die Wörter und Zeichen ZWISCHEN den beiden Keywords suchen nicht dahinter. Eine textdatei würde wie folgt aussehen:

    [code]
    blablabla

    [Keyword1]das ist toll[Keyword2]

    und mit Regex soll er dann ausgeben: "das ist toll".

    Danke schonmal für eure Hilfe und sry für den Doppelpost!!!





  • Um ehrlich zu sein: Ich habe keine Ahnung wie ich diese Funktionen anwenden soll. Kann vll. einer so eine Art Beispielcode schreiben, welcher einfach folgenden String auswertet:

    [Key1]hallo hallo[Key2]
    

    Das wäre echt super. Regex ist echt nicht meine Stärke.



  • [Key1](*.)[Key2]
    


  • Der Code von Zwutz funktioniert, solange nicht mehrfach [Key2] in der Zeile steht da Regexs per default greedy sind, also einen möglichst großen Ausdruck suchen. Sollte das Keyword beliebig oft in der Zeile auftauchen sollte es sowas wie

    [Key1](*.?)[Key2]
    

    tun. Allerdings kenne ich die regex Syntax in der boost-lib nicht so gut, deswegen weiß ich nicht genau ob das anhängen von "?" auch dort bewirkt das der Ausdruck shy ist.

    MfG



  • Wie würde denn ein Function aussehen die mit diesem Expression arbeitet??? Wenn ich das mit meiner ursprünglichen Function verbinde kommen da immer nur Exceptions bei rum. Vielleicht kann mir einer mal nen richtigen Beispielcode schreiben wie das funktionieren würde.

    Vielen Dank schonmal!!!!!



  • Vor gewisser Zeit gabs hier im Forum schonmal nen Thread zu Boost-Regex, da war auch ein Beispielcode zu finden. Vversuchs mal über die Forensuche.

    MfG



  • Ok ich habs jetzt einigermaßen mit der Funktion:

    string config_lesen( const string& text, const boost::regex& e, string::size_type pos ) 
    { 
        string res[2]; 
        boost::match_results< string::const_iterator > what; 
        if( boost::regex_search( text.begin() + pos, text.end(), what, e ) ) 
        { 
            // what[0] enthält den gesamten Ausdruck 
            res[0] = what[1];   // 1. Gruppe  ([[:alpha:]]+) 
            res[1] = what[2];   // 2. Gruppe                 ([[:alpha:]]+) 
        } 
        return res[0]+res[1]; 
    }
    

    hinbekommen.
    Ich rufe die Funktion wie folgt auf:

    cout<<config_lesen("DateibycxvbDatei1", boost::regex( "Datei([[:alpha:]]+)Datei1"   ),0);
    

    Dieser Funktionsaufruf gibt aber immer nur ein Wort zurück immer das erste und wenn ein Punkt innerhalb der Zeichenfolge vorkommt gibt er nur alles bis zum Punkt aus. Ich habe jetzt versucht das mit Zwutz und Jasc Hilfe zu lösen und habe den Funktionsaufruf so geändert:

    cout<<config_lesen("Dateiby cxvbDatei1", boost::regex( "Datei(*.?)Datei1"   ),0);
    

    Jetzt gibt der mir immer ne Exception aus...

    Vielleicht mache ich auch nur einen dummen Fehler. Danke schonmal für eure Hilfe!!!



  • Hallo,

    und so:

    cout<<config_lesen("Dateiby cxvbDatei1", boost::regex( "Datei.*?Datei1" ),0);
    

    MfG,

    Probe-Nutzer



  • So gibt er mir gar nichts mehr aus. Wahrscheinlich sucht er jetzt nurnoch nach dem ganzen Ausdruck ohne das was in der Mitte steht auszugeben.



  • Habe nur den Ausdruck korrigiert, aber nicht dein eigentliches Problem, dass du nur den Text zwischen den Schlüsselwörtert haben willst. Weil der von mir gezeigte Ausdruck keine Gruppen mehr enthält, Klammern einfügen:

    cout<<config_lesen("Dateiby cxvbDatei1", boost::regex( "Datei(.*?)Datei1" ),0);
    

    Und dann in config_lesen what[1] zurückgeben.

    MfG,

    Probe-Nutzer



  • Vielen Dank!!!!

    Das hat super geklappt!


Anmelden zum Antworten