boost::regex benutzung



  • hi,
    weiß einer wie man mit den boost-klassen reguläre ausdrücke benutzen kann?
    in der dokumentation steig ich nicht so richtig durch.
    ich habe eine funktion die prüfen soll ob in einem übergebenen string ein übergebenen regulären ausdruck an einer bestimmten stelle zutrifft und wenn das so ist, die ganzen stellen, die in dem regulären ausdruck in klammern gesetzt sind zurück geben.

    vector<string> beginswith(string text, boost::regex e, pos) {
        /* trifft der ausdruck an der stelle pos von text zu
         * wenn ja, gib die gefundenen abschnitte in einer liste zurück
         */
    }
    

    wird die funktion zum beispiel mit text="trallala <foo bar=bla> foo", pos=9 und e=/<foo[[:space:]]+([[:alpha:]]+)=([[:alpha:]]+)/ aufgerufen,
    sollte die funktion eine liste mit "bar" und "bla" zurückgeben.

    Hab leider keine Ahnung wie ich mit z.B. regex_match oder _search dazu bewegen könnte mir so ein ergebnis zu liefern.

    mfg, cypher



  • Da sind doch eh einige Examples dabei. Du musst dir ja eigentlich nur das rauskopieren, was du am ehesten brauchst, und verändern.



  • Hallo Cypher,

    mit regex_search geht es etwa so:

    #include <boost/regex.hpp>
    
    #include <iostream>
    #include <string>
    #include <vector>
    
    std::vector< std::string > beginswith( const std::string& text, const boost::regex& e, std::string::size_type pos )
    {
        std::vector< std::string > res( 2 );
        boost::match_results< std::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;
    }
    
    int main()
    {
        std::vector< std::string > res = beginswith( 
            "trallala <foo bar=bla> foo",
            boost::regex( "<foo[[:space:]]+([[:alpha:]]+)=([[:alpha:]]+)" ),
            9 );
        std::cout << res[0] << "=" << res[1] << std::endl;
        return 0;
    }
    

    das 'pos' wäre aber nicht nötig, solange vorher kein passender Ausdruck erscheint.

    Gruß
    Werner

    Edit: const reference hinzugefügt


Anmelden zum Antworten