RegEx mit Boost



  • Ich bin gerade dabei Regular Expressions zu lernen, aber verstehe sie nach Stunden des Toturials/Dokumentations lesen immer noch nicht. Könnte mir bitte vieleicht jemand ein komplettes Beispiel posten wie ich an den String "hallo" aus dem String "ABC hallo DEF" komme? Das würde mir schon einmal deutlich weiterhelfen. Ich habe leider trotz intensivem googelns keine Tutorials/Beispiele gefunden die mir weiterhelfen würden.

    Im Voraus schon mal danke!

    mfg
    zigarrre



  • Ganz simples Beispiel ohne Schnickschnack wie Gruppierungen und so.

    #include <iostream>
    #include <string>
    
    #include "../_include/boost/regex.hpp"
    
    int main()
    {
    	// Ausgangsstring
    	std::string text = "ABC haaaaallllooooo DEF";
    
    	// regular expression
    	boost::regex expression("[halo]+");
    	// fuer die Rueckgabe der spaeteren Ergebnisse
    	boost::match_results<std::string::const_iterator> what;
    
    	// Rueckgabe true bei Erfolg (also wenn was gefunden wurde
    	std::cout << boost::regex_search(text, what, expression) << std::endl;
    
    	// in what [0] steht hier in dem Fall dein Ergebnis
    	std::cout << what[0] << std::endl;
    }
    


  • Kann das Beispiel nicht kompilieren. Ich habe das 1:1 kopiert und nur

    #include "../_include/boost/regex.hpp"
    

    in

    #include <boost/regex.hpp>
    

    geändert, aber erhalte beim Kompilieren folgende Fehlermeldungen:

    obj/Debug/main.o||In function `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)':|
    /usr/include/boost/regex/v4/basic_regex.hpp|425|undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'|
    obj/Debug/main.o||In function `bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)':|
    /usr/include/boost/regex/v4/regex_search.hpp|56|undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find()'|
    obj/Debug/main.o||In function `perl_matcher':|
    /usr/include/boost/regex/v4/perl_matcher.hpp|366|undefined reference to `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::construct_init(boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags)'|
    obj/Debug/main.o||In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::unwind_extra_block(bool)':|
    /usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp|1113|undefined reference to `boost::re_detail::put_mem_block(void*)'|
    obj/Debug/main.o||In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::match_match()':|
    /usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp|969|undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >::maybe_assign(boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > const&)'|
    obj/Debug/main.o||In function `void boost::re_detail::raise_error<boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > >(boost::regex_traits_wrapper<boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::error_type)':|
    /usr/include/boost/regex/pattern_except.hpp|75|undefined reference to `boost::re_detail::raise_runtime_error(std::runtime_error const&)'|
    obj/Debug/main.o||In function `boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::extend_stack()':|
    /usr/include/boost/regex/v4/perl_matcher_non_recursive.hpp|213|undefined reference to `boost::re_detail::get_mem_block()'|
    obj/Debug/main.o||In function `boost::cpp_regex_traits<char>::transform(char const*, char const*) const':|
    /usr/include/boost/regex/v4/cpp_regex_traits.hpp|906|undefined reference to `boost::re_detail::cpp_regex_traits_implementation<char>::transform(char const*, char const*) const'|
    obj/Debug/main.o||In function `boost::cpp_regex_traits<char>::transform_primary(char const*, char const*) const':|
    /usr/include/boost/regex/v4/cpp_regex_traits.hpp|910|undefined reference to `boost::re_detail::cpp_regex_traits_implementation<char>::transform_primary(char const*, char const*) const'|
    obj/Debug/main.o||In function `boost::re_detail::cpp_regex_traits_implementation<char>::error_string(boost::regex_constants::error_type) const':|
    /usr/include/boost/regex/v4/cpp_regex_traits.hpp|440|undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'|
    /usr/include/boost/regex/v4/cpp_regex_traits.hpp|442|undefined reference to `boost::re_detail::get_default_error_string(boost::regex_constants::error_type)'|
    ||=== Build finished: 11 errors, 0 warnings ===|
    

    Woran liegt das? Ich kompiliere mit G++ 4.4.3 unter Ubuntu. Boost 1.40 hab ich per Paketverwaltung instaliert. Als IDE verwende ich Code::Blocks.

    Auserdem habe ich das Problem das ich das "hallo" nicht kenne (das ist variabel) ich weiß nur das es von "ABC " und " DEF" eingegrenz ist.

    Aber, trotzdem schon mal danke, dank deinem Beispiel hab ich jetzt endlich mal verstanden wie ich an das Ergebnis komme.





  • linke die Boost.RegEx-Bibliothek

    bspw -lboost_regex , falls du beim bauen von Boost das flache Layout gewählt hast



  • zigarre schrieb:

    Regular Expressions zu lernen, aber verstehe sie nach Stunden des Toturials/Dokumentations lesen immer noch nicht

    Haperts am Verständnis der RegExp oder an der Umsetzung?

    BasicMan01 schrieb:

    // Ausgangsstring
        std::string text = "ABC haaaaallllooooo DEF";
    
        // regular expression
        boost::regex expression("[halo]+");
    

    Wenn ich das mit meinem Qt QRegExp Verständnis zerlege, suchst du da nur nach vorkommen einzelner Buchstaben die immer mehr als 1 mal vorkommen müssen ...
    ich würde da eher nach sowas suchen:

    "(h+a+l{2,}o+)"

    Beim Verständnis hat mir sehr das Qt Beispiel für RegExps geholfen, falls dein System Qt rumliegen hat, kannst du das ja mal starten:

    http://doc.qt.nokia.com/4.6/tools-regexp.html



  • Wenn ich per:

    sudo ./bootstrap.sh --prefix=/usr/local/
    sudo ./bjam
    

    versuche Boost zu kompilieren läuft das ganze eine ewigkeit, gibt unmengen Sachen auf der Konsole aus und danach hab ich erst keine einzige library die was mit boost zu tun haben könnte. Beim bjam kommando kommen unmengen ausgaben in denen "fail" steht. Aber was mach ich falsch?

    mfg
    zigarrre



  • Hallo,

    das wird keiner wissen was du falsch machst, da auch keine Fehler da stehen 🙂

    also zur Boost-Installation. Das mit dem Prefix kannst du dir schenken, da es eh der Standard Pfad ist und man macht es nicht mit sudo! Man kompiliert normalerweise nicht mit root rechten, das macht keinen sinn. Sudo nutzt man nach der erfolgreichen Kompilierung für Installationen. Hier die Vorgehensweise bei Boost.

    ./bootstrap.sh
    ./bjam
    sudo ./bjam install
    

    Nun sollte alles unter /usr/local/include und unter /usr/local/lib lieben.

    Boost sagt eigentlich recht eindeutig welche Libraries nicht kompiliert werden können, dann wirst du unter Umständen ein Abhängigkeitsproblem haben.

    Poste doch mal deine Fehlermeldungen, da wird ja nicht einfach nur "fail" stehen 🙂

    so long
    jd



  • padreigh schrieb:

    Wenn ich das mit meinem Qt QRegExp Verständnis zerlege, suchst du da nur nach vorkommen einzelner Buchstaben die immer mehr als 1 mal vorkommen müssen ...
    ich würde da eher nach sowas suchen:

    "(h+a+l{2,}o+)"

    😃 Das macht natürlich mehr Sinn, wenn man das Wort hallo braucht.
    Ich hatte wieder mal zuviel herumgespielt

    Man kann ja auch gleich

    boost::regex expression("hallo");
    

    schreiben :p



  • Hier ist mal ein schöner Link um Reguläre ausdrücke zu testen: http://regexe.de/
    Kann ich nur empfehlen, muss man sein Programm nicht immer neu kompilieren 🙂

    so long
    jd



  • Das man nicht mit root-Rechten kompiliert weiß ich schon, habs nur mal getestet weil ich mir gedacht hab vieleicht funktionierts so. Mit einem zivilisiertem Build-System wie Makefiles kann ich auch umgehen.

    ./bootstrap.sh
    

    muss man übrigens mit root-Rechten ausführen.

    Hier die Ausgabe von

    sudo ./bootstrap.sh
    

    :

    Building Boost.Jam with toolset gcc... tools/jam/src/bin.linuxx86/bjam
    Detecting Python version... 2.6
    Detecting Python root... /usr
    Unicode/ICU support for Boost.Regex?... not found.
    Backing up existing Boost.Build configuration in project-config.jam.2
    Generating Boost.Build configuration in project-config.jam...
    
    Bootstrapping is done. To build, run:
    
        ./bjam
    
    To adjust configuration, edit 'project-config.jam'.
    Further information:
    
       - Command line help:
         ./bjam --help
    
       - Getting started guide: 
         http://www.boost.org/more/getting_started/unix-variants.html
    
       - Boost.Build documentation:
         http://www.boost.org/boost-build2/doc/html/index.html
    

    Die Ausgabe von

    ./bjam
    

    hat über 129000 Zeilen groß, das sind als Textfile gespeichert 10,6 MB. Wo soll ich das hochladen?

    mfg
    zigarrre

    edit:
    Ich hab das Problem jetzt gelöst. Auch wenn ich nicht wirklich weiß wie. Zuerst habe ich das Paket per

    sudo aptitude purge libboost-dev
    

    deinstaliert, danach den Sourcecode neu heruntergeladen den boost ordner (den wo die header-files drinnen sind) nach "\usr\local" kopiert und dann per

    ./bootstrap.sh --with-libraries=regex
    sudo ./bjam install
    

    compiliert und instaliert. Dann hats plötzlich funktioniert. Keine Ahnung was ich vorher falsch gemacht habe.

    Den RegEx hab ich mir jetzt durch herumprobieren zusammengebastelt (Danke für die tolle Website!).

    (?<=ABC )[\w-]*
    

    Das funktioniert zwar nicht mit dem "ABC hallo DEF" Beispiel aber in meinem Projekt wird das ende durch sonderzeichen und einem Zeilenumbruch dargestellt. Für die Zukunft und aus interesse würds mich trozdem interesieren wie ich da das Ende auch noch angeben kann? Wie findet ihr diese RegEx sonnst?

    mfg
    zigarrre


Log in to reply