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
-
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...
-