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.