Ausdrücke bilden mit std::regex

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Ausdrücke bilden mit std::regex

Beitrag von Bebu » So Mär 03, 2013 10:04 pm

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
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Ausdrücke bilden mit std::regex

Beitrag von nufan » So Mär 03, 2013 10:30 pm

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

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Ausdrücke bilden mit std::regex

Beitrag von Bebu » So Mär 03, 2013 11:07 pm

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
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Ausdrücke bilden mit std::regex

Beitrag von nufan » So Mär 03, 2013 11:18 pm

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

nouseforname
Beiträge: 236
Registriert: Do Feb 10, 2011 6:31 pm

Re: Ausdrücke bilden mit std::regex

Beitrag von nouseforname » Mo Mär 04, 2013 5:20 am

Ich nutze immer dieses kleine Tool:http://www.weitz.de/regex-coach/.

Hat mir schon oft geholfen.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Ausdrücke bilden mit std::regex

Beitrag von Bebu » Mo Mär 04, 2013 8:26 am

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 "
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Ausdrücke bilden mit std::regex

Beitrag von nufan » Mo Mär 04, 2013 10:50 am

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

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

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Ausdrücke bilden mit std::regex

Beitrag von Bebu » Mo Mär 04, 2013 12:20 pm

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
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Antworten