c++11 regex - unverstaendnis



  • Hallo zusammen

    ich beschäftige mich gerade mit regex, da diese mir doch abundan weiterhelfen könnten. Beim Ausprobieren bin ich auf ein Problem oder besser gesagt auf Unverständnis ( bei mir ) gestoßen.

    sourcecode:

    {
          std::string s("01010101");
          std::string pattern("0*.*");
          std::regex e(pattern, std::regex::icase);
          if (std::regex_match(s, e, std::regex_constants::match_default))
             std::cout << "matching: ";
          else
             std::cout << "NO matching: ";
    
          std::cout << "\"" << s << "\" (pattern: " << pattern << ")\n";
       }
    
       {
          std::string s("01010101");
          std::string pattern("[0-1]*.*");
          std::regex e(pattern, std::regex::icase);
          if (std::regex_match(s, e, std::regex_constants::match_default))
             std::cout << "matching: ";
          else
             std::cout << "NO matching: ";
    
          std::cout << "\"" << s << "\" (pattern: " << pattern << ")\n";
       }
    

    Output:
    matching: "01010101" (pattern: 0*.)
    NO matching: "01010101" (pattern: [0-1]
    .*)

    1.)
    Das erste ergibt für mich Sinn.
    Das zweite jedoch nicht. Ich sage doch, dass Ziffern von 0-1 erlaubt sind.

    Wieso matched das zweite nicht?

    2.)
    Sobald ich diese "[]" verwende, und auf "std::regex::icase" verzichte, bekomme ich eine Exception. Warum?

    Mir scheint, dass mir hier noch einiges an Verständnis für reguläre Ausdrücke fehlt... Vielleicht könnt ihr mir weiterhelfen 😉



  • Ich sehe keinen Fehler. Du könntest [01] schreiben.

    Welchen Compiler verwendest du? gcc 4.8 kann z.B. noch nicht alles. Im Zweifelsfall geht boost.



  • Welches Script wird denn genommen, wenn man nur icase setzt?
    Setz mal im Ctor auch ECMAScript | icase



  • manni66 schrieb:

    Ich sehe keinen Fehler. Du könntest [01] schreiben.

    Welchen Compiler verwendest du? gcc 4.8 kann z.B. noch nicht alles. Im Zweifelsfall geht boost.

    manni hat recht. mit dem G++ 4.9 ergibt sich einwandfrei

    matching: "01010101" (pattern: 0*.*)

    matching: "01010101" (pattern: [0-1].)



  • ok, dann liegts wohl am compiler...



  • In diese Falle bin ich auch getappt. Dass keine Exception geworfen wird oder gar das Kompilieren verhindert wird, finde ich ziemlich unbefrieigend.



  • regextest schrieb:

    manni66 schrieb:

    Ich sehe keinen Fehler. Du könntest [01] schreiben.

    Welchen Compiler verwendest du? gcc 4.8 kann z.B. noch nicht alles. Im Zweifelsfall geht boost.

    manni hat recht. mit dem G++ 4.9 ergibt sich einwandfrei

    matching: "01010101" (pattern: 0*.*)

    matching: "01010101" (pattern: [0-1].)

    Nur mal so am Rande: "0*.*" ist das gleiche wie "", matcht (matched?, matscht 😃 ) also alles. Das 2. Pattern genauso.

    "" bedeutet 0 oder mehrmals. Damit matcht 0 auch, wenn keine 0 vor kommt. "." bedeutet ein beliebiges Zeichen 0 oder mehrmals. Also irgendetwas kein mal findet sich immer irgendwo. "[0-1]" sucht nach 0 oder 1, ist aber auch zufrieden, wenn es 0 mal vorkommt.


Anmelden zum Antworten