Seite 1 von 1
Ausdrücke bilden mit std::regex
Verfasst: So Mär 03, 2013 10:04 pm
von Bebu
Ich schreibe gerade ein neues Userinterface für Dedupe. Das alte war ziemlich schlecht und kaum erweiterbar/zu warten. Ich arbeite jetzt mit einer Textdatei und dabei gibt es verschiedene Syntaxmethoden. Ich suche jetzt eine Möglichkeit diese Unterschiede mittels Regulärer Ausdrücke zu unterscheiden und passend zu verarbeiten. Ich muss folgendes voneinander unterscheiden:
Code: Alles auswählen
"Pfad/zurDatei" option(einzelner Buchstabe oder Wort)
"Pfad/zur/Datei"
"Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Meine regulären Ausdrücke sehen bisher so aus:
Code: Alles auswählen
std::regex PathDecision, PathDecisionPath;
PathDecision = "(\")(.*)(\")(a-zA-Z)";
PathDecisionPath = "(\")(.*)(\")(.*)(\")(.*)(\")";
Mit PathDecision klappt gar nichts, es erkennt keines der obigen Pattern, PathDecisionPath erkennt auch Strings, die nicht passen. Kann mir jemand helfen? Google spuckt zur Bildung der Ausdrücke im Zusammenhang mit std::regex nicht sonderlich viel aus.
Bebu
Re: Ausdrücke bilden mit std::regex
Verfasst: So Mär 03, 2013 10:30 pm
von nufan
Ich denke das Problem sind eher deine Audrücke selbst als std::regex.
Du solltest für die Zeichen zwischen den Anführungszeichen einen nicht-gierigen Ausdruck (mit '?') verwenden. Aber davon mal abgesehen gehe ich durch wieso die Ausdrücke nicht gehen:
Versuch 1:
Kein Leerzeichen und die letzte Gruppe matcht nur ein einzelnes Zeichen - keine Wörter und auch nicht mehrere einzelne Buchstaben.
Versuch 2:
Dein Pattern verlangt ein einzelnes Zeichen direkt nach dem Anführungszeichen.
Versuch 3:
Eine Mischung aus den beiden obigen.
Nächstes Pattern:
Wieder solltest du keine gierigen Quantoren verwenden.
Versuch 1:
Du hast keinen zweiten Ausdruck ohne Klammern.
Versuch 2:
Siehe 1.
Versuch 3:
Versuch das ganze nochmal mit richtigen Quantoren, dann sollte das funktionieren denke ich.
Ich würde folgenden Ausdruck versuchen:
UNGETESTET ^^
Re: Ausdrücke bilden mit std::regex
Verfasst: So Mär 03, 2013 11:07 pm
von Bebu
Danke, aber noch ist mein Problem nicht gelöst. Ich glaube ich habe mich falsch ausgedrückt. Ich brauch für jeden der Pattern einen Regex, der ausschließlich diese Pattern erkennt. Ich habe heute angefangen mich mit regulären Ausdrücken auseinanderzusetzen, ist also absolutes Neuland für mich. Dein Ausdrück führt übrigens zu einer Exception
Re: Ausdrücke bilden mit std::regex
Verfasst: So Mär 03, 2013 11:18 pm
von nufan
Bebu hat geschrieben:Ich brauch für jeden der Pattern einen Regex, der ausschließlich diese Pattern erkennt. Ic
Sorry, hab ich falsch verstanden.
Versuch 1:
Pattern:
Versuch 2:
Pattern:
Versuch 3:
Pattern:
Die Pattern sind fertig wie du sie direkt in C++ angeben würdest, auch bereits mit Anführungszeichen für die Kennzeichnung als String.
Hier getestet:
http://www.regexplanet.com/advanced/java/index.html
(ich weiß du verwendest kein Java, aber der Regex-Syntax sollte gleich sein denke ich)
Bebu hat geschrieben:Dein Ausdrück führt übrigens zu einer Exception
Verstehe ich nicht ganz... was für eine Exception?
Dieser String passt laut Online-Test auf alle 3 Eingaben:
Re: Ausdrücke bilden mit std::regex
Verfasst: Mo Mär 04, 2013 5:20 am
von nouseforname
Ich nutze immer dieses kleine Tool:
http://www.weitz.de/regex-coach/.
Hat mir schon oft geholfen.
Re: Ausdrücke bilden mit std::regex
Verfasst: Mo Mär 04, 2013 8:26 am
von Bebu
So, vielen Dank, ich habe wieder einen Fehler gefunden. std::regex ist noch nicht vollständig in gcc eingebaut und daher kann das nicht so klappen, wie es sollte. Ich habe jetzt erst mal auf Boost::regex gewechselt und siehe da, wir kommen der Sache näher. Folgende Probleme habe ich noch.
Erkennt sowohl "Pfad/zur/Datei" als auch "Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Erkennt gar nichts von meinen Pattern.
Der letzte tut, was er soll. Ich suche speziell einen Ausdruck für folgendes:
- Erstes Zeichen soll " sein, dann beliebige Zeichen, außer ". Letztes Zeichen wieder "
- Erstes Zeichen soll " sein, dann beliebige Zeichen, außer ". Dann wieder ". Anschließend beliebige Zeichen außer "
Re: Ausdrücke bilden mit std::regex
Verfasst: Mo Mär 04, 2013 10:50 am
von nufan
Bebu hat geschrieben:Folgende Probleme habe ich noch.
Erkennt sowohl "Pfad/zur/Datei" als auch "Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Ja klar...
Bebu hat geschrieben:
Erkennt gar nichts von meinen Pattern.
Hm...
?
Re: Ausdrücke bilden mit std::regex
Verfasst: Mo Mär 04, 2013 12:20 pm
von Bebu
Vielen Dank für deine kräftige Hilfe, ich habe es jetzt hinbekommen. Dein letztes Pattern habe ich noch etwas verändern müssen, damit es funktioniert. Hier die Finalisten, die bisher tun, was sie sollen:
Code: Alles auswählen
Path = "\"([^\"]*)\"";
PathDecision = "\"([^\"]*)\"([\\w ]{1,})";
PathDecisionPath = "\"(.*?)\" [\\w ]*? \".*?\"";
Vielleicht fällt ja noch ein Fehlerteufel auf, den ich anschließend wie verrückt suchen würde, aber ansonsten würde ich es so einbauen