Regulärer Ausdruck und regex_match
-
Ich habe bis dato alle meine regulären Ausdrücke so gebaut, so habe ich es erstmals gelernt.
-
Wie "so"? Du schreibst immer 4711 auch wenn du ken Kölnisch Wasser suchst?
-
Nein. Das macht doch nichts kaputt an der Funktionaltät des Ausdrucks?
-
Alex1994 schrieb:
Nein. Das macht doch nichts kaputt an der Funktionaltät des Ausdrucks?
Du meinst also, man kann beliebig '\' in den Ausdruck streuen, ohne dass das Auswirkungen hat?
-
Nein, wenn ich mit Raw Strings arbeite, dann haben die \ ja eine Bedeutung.
So z. B.:
regex t {R"((\.*),\s*(\.*))"};
Wo ich diesen Ausdruck schon gepostet habe: Der ursprüngliche Grund, warum ich diesen Thread überhaupt eröffnet habe, war der, dass ich Zeilen der Form
hier steht was, hier steht wieder was
matchen will, also vor und hinter dem Komma irgendwas, nicht nur Buchstaben. Der obige Ausdruck sollte das doch eigentlich erkennen, tut er aber nicht.
Edit: Ich habe die Backslashes jetzt einfach rausgenommen, wobei ich mir jetzt nicht mehr sicher bin, ob ich deren Funktion richtig verstanden habe, ich schau lieber nochmal nach. Jedenfalls tut es jetzt so, wie es soll.
-
Der Witz des Rawstrings ist es, dass du nicht \\ schreiben musst, um \ im Ausdruck zu haben.
\. wird als Punkt gematcht, nicht als beliebiges Zeichen.
-
Zu dieser Erkenntnis bin ich nach abermaliger Lektüre auch gekommen, kein Wunder, dass das nicht hingehauen hat.
-
Da es in folgendem Problem um regex_match geht, schreibe ich es auch hier rein. Regex_match liefert ja true oder false zurück, das heißt, ich kann
Code:
if (regex_match(input, x))
schreiben, x ist der reguläre Ausdruck
Code:
regex x (R"(.*)" + as + R"(.*)" + bs + R"(.*)" + cs + R"(.*)", regex_constants::icase);
wobie as, bs und cs vorher eingelesen wurden. Wenn ich der if-Verzweigung aber regex_match gebe, dann bekomme ich die Meldung, dass das Programm nicht mehr funktioniert, obwohl aber auf der Konsole das gewünschte Resultat erscheint. Wenn ich ein paar andere Programmzeilen mit einbaue und die Bedingung dann ändere, dann passiert das nicht. Ich habe so etwas noch nicht gehabt, obwohl ich schon mehrmals mit regex_match als Bedingung gearbeitet habe. Hat jemand eine Idee, was hier passiert?
Edit: Ich habe eben nochmal weiter versucht und festgestellt, dass es an folgenden drei Zeilen in dem if liegen muss, denn wenn ich die rausnehme, dann funktioniert das ganze:
srand(time(0)); int q = rand()%l.size(); cout << l[q] << endl;
-
Was ist den l?
-
Oh, das habe ich vergessen zu nennen: l ist ein Vektor, der in den Zeilen darüber auch innerhalb des ifs mit Wörtern befüllt wird. Von denen soll dann eines auf der Konsole ausgegeben werden, das sollen die oben genannten drei Zeilen bewerkstelligen.
-
kannst du ein kompilierbares Programm posten, möglichst minimal das den Fehler reproduziert?
-
Hat sich erledigt, im Quelltext selbst lag der Fehler gar nicht, es war die Datei, aus der ich mit einem Stringstream auslese (da kommen auch die Einträge des Vektors her). Dort darf offenbar keine Zeile sein, in der nichts drinsteht, denn solche Leerzeilen habe ich nun entfernt und nun klappt es. Dennoch danke, out, dass du bereit warst zu helfen