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.

Code: Alles auswählen

PathDecision = "(\")(.*)(\")(a-zA-Z)";
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:

Code: Alles auswählen

"Pfad/zurDatei" option(einzelner Buchstabe oder Wort)
Kein Leerzeichen und die letzte Gruppe matcht nur ein einzelnes Zeichen - keine Wörter und auch nicht mehrere einzelne Buchstaben.
Versuch 2:

Code: Alles auswählen

"Pfad/zur/Datei"
Dein Pattern verlangt ein einzelnes Zeichen direkt nach dem Anführungszeichen.
Versuch 3:

Code: Alles auswählen

"Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Eine Mischung aus den beiden obigen.

Nächstes Pattern:

Code: Alles auswählen

PathDecisionPath = "(\")(.*)(\")(.*)(\")(.*)(\")";
Wieder solltest du keine gierigen Quantoren verwenden.
Versuch 1:

Code: Alles auswählen

"Pfad/zurDatei" option(einzelner Buchstabe oder Wort)
Du hast keinen zweiten Ausdruck ohne Klammern.
Versuch 2:

Code: Alles auswählen

"Pfad/zur/Datei"
Siehe 1.
Versuch 3:

Code: Alles auswählen

"Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Versuch das ganze nochmal mit richtigen Quantoren, dann sollte das funktionieren denke ich.

Ich würde folgenden Ausdruck versuchen:

Code: Alles auswählen

\"(.*?)\" ([\\w ]*?)? (\"(.*?)\")?
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:

Code: Alles auswählen

"Pfad/zurDatei" option(einzelner Buchstabe oder Wort)
Pattern:

Code: Alles auswählen

"\"(.*?)\" [^\"]+"
Versuch 2:

Code: Alles auswählen

"Pfad/zur/Datei"
Pattern:

Code: Alles auswählen

"\"(.*?)\""
Versuch 3:

Code: Alles auswählen

"Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Pattern:

Code: Alles auswählen

"\"(.*?)\" [\\w ]*? \".*?\""
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:

Code: Alles auswählen

"\"(.*?)\"( [\\w ]*?)?( \"(.*?)\")?"

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.

Code: Alles auswählen

    "\"(.*?)\""
Erkennt sowohl "Pfad/zur/Datei" als auch "Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"

Code: Alles auswählen

"\"(.*?)\" [^\"]+"
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.

Code: Alles auswählen

    "\"(.*?)\""
Erkennt sowohl "Pfad/zur/Datei" als auch "Pfad/zur/Datei" option "Pfad/zum/Link/Ziel"
Ja klar...

Code: Alles auswählen

"\"([^\"]*)\""
Bebu hat geschrieben:

Code: Alles auswählen

"\"(.*?)\" [^\"]+"
Erkennt gar nichts von meinen Pattern.
Hm...

Code: Alles auswählen

"\"([^\"]*?)\" [^\"]+"
?

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