Mit regulären Ausdrücken Strings suchen



  • Hallo!

    Ich versuche gerade mit den regulären Ausdrücken in C++11 einen Tokenizer zu bauen. Das klappt bisher auch ganz gut, allerdings habe ich ein Problem mit den Strings. Folgendes sollte eigentlich nicht matchen, tut es aber doch:

    #include <regex>
    #include <iostream>
    
    int main()
    {
      std::string test = " \"test\\\" "; // "test\"                                                                                                                                                                                  
      std::regex regex("\"([^\"]|\\\\\")*[^\\\]\""); // "([^"]|\\")*[^\]"                                                                                                                                                          
      std::smatch match;
      std::regex_search(test, match, regex);
      std::cout << match.str() << std::endl;
      return 0;
    }
    

    Warum? Auf regexr.com funktioniert der reguläre Ausdruck wie gewünscht.

    Danke im Voraus!
    Harry


  • Mod

    Kleiner Tipp, nutze Raw String Literals

    std::regex regex( R"("([^"]|\\")*[^\]")" );
    


  • Danke! Das ist sehr nützlich. 🙂
    Das eigentliche Problem besteht jedoch weiterhin.



  • Wenn ich regex_match verwende, tut er was er soll:

    #include <regex>
    #include <iostream>
    
    int main()
    {
      std::string test = R"("test\")";
      std::regex regex(R"("([^"]|\\")*[^\]")");
      std::smatch match;
      std::regex_search(test, match, regex);
      std::cout << "search: " << match.str() << std::endl;
      std::regex_match(test, match, regex);
      std::cout << "match:  " << match.str() << std::endl;
      return 0;
    }
    

    Ausgabe:

    search: "test\"
    match:
    

    Ist das vielleicht ein Bug in regex_search? Ich benutze GCC 4.9.0.



  • Kann's nicht testen.

    Aber warum gehst Du eigentlich davon aus, dass Dein erstes Beispiel matcht? Muesstest Du nicht den Rückgabewert von regex_search() testen?



  • regex_search gibt true zurück und regex_match gibt false zurück.

    Mit clang++ und libc++ funktioniert es übrigends, scheint also tatsächlich ein Bug in libstdc++ zu sein...




Log in to reply