Laden...

Choice mit Reihenfolge in Regex formulieren

Erstellt von Quaneu vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.167 Views
Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 5 Jahren
Choice mit Reihenfolge in Regex formulieren

Hallo zusammen,

ich würde gern eine Art Choice in Regex formulieren. Leider schaffe ich dies nicht 100%.

Z.B. Soll der Name aus A, B oder C bestehen, wobei A, B oder C wieder ein Regex sein kann. Wenn es nur einen Treffer geben soll, also Choice min=1 max=1 ist, habe ich eine Lösung "(A+|B+|C+)".

Komplizierter wird es wenn max z.B. 2 ist und dieser öfter treffen soll.
Hier ein konkreteres Beispiel:
A = [a|b|c], B = [d|e|f], C= [g|h|i] und der Name soll "adgbeh" sein.
Wenn ich nun folgenden Regex benutzte "((([a|b|c])+|[d|e|f])+|([g|h|i])+){1,2})*" sagt mir dieser, dass der Name gültig ist, aber meine Captures sind nicht so, wie ich sie brauche. In diesem Fall "ad gb eh". Das Problem dabei ist jedoch "gb". Es soll nämlich die Reihenfolge der Elemente berücksichtigt werden und g kommt nach dem b. Mein Ziel ist es, folgende Captures zu erhalten "ad g be h".

Ich habe es schon mit Lookaround probiert, jedoch ohne Erfolg.

Hätte jemand eine Idee, wie ich dieses umsetzen kann?

Schöne Grüße
Quaneu

49.485 Beiträge seit 2005
vor 5 Jahren

Hallo Quaneu,

durch das {1,2} bekommst du die Möglichkeit einer Wiederholung, aber eben der gesamten Detailalternativen. Wenn ich dich richtig verstehe, willst du aber gerade keine Wiederholung aller Detailalternativen, sondern nur der, die "größer" sind. Dann müsstest du das explizit so angeben, also nach A ist B und C erlaubt, nach B ist C erlaubt und nach C gar nichts. Also hättest du drei Hauptalternativen mit den genannten Detailalternativen. Ja, dadurch ist der Pattern viel länger und aufwändiger(*). Per Regex kriegt man das m.E. nicht kürzer. Vereinfachen kann man das m.E. nur, indem man die einzelnen Detailalternativen matcht und dann die zulässigen Paare per normalem C# zusammensetzt.

herbivore

(*) Einigermaßen DRY bekommt man das trotzdem hin, wenn man die einzelnen Detailalternativen in String-Konstanten ablegt und diese dann beim Zusammenfügen mit normalem C# mehrfach benutzt. Also so wie du das mit groß A, B und C auch hier im Text gemacht hast.

Quaneu Themenstarter:in
692 Beiträge seit 2008
vor 5 Jahren

Hallo herbivore,

vielen Dank für deine Hilfe.

Mein Beispiel sollte folgenden Fall abdecken:

Ein Wort muss aus den Bestandteilen A,B und C bestehen, wobei man nur ein oder zwei Bestandteile wählen darf, dies aber beliebig oft. Jedoch mit der weiteren Einschränkung, dass die Reihenfolge beachtet werden soll. D.h. wenn ich 2 Bestandteile wähle, darf z.B. kein Element aus B vor denen aus A kommen usw.

Das bauen des Regexes ist nicht das Hauptproblem, sondern eher der Regex selbst. Wenn es nur diese Möglichkeit gibt, muss ich testen ob dies noch möglich ist, da z.B. A aus 6000 Wörtern besteht B hat mind. genau soviel usw.. dadurch würde der Regex extrem "lang" werden. Aber ich probier es mal im Kleinen.

Schöne Grüße und vielen Dank
Quaneu

P.S. Danke für dein Regex-Lab ist wirklich super und hat mir schon oft sehr weiter geholfen👍

49.485 Beiträge seit 2005
vor 5 Jahren

Hallo Quaneu,

bei deinem Pattern kommen A, B und C je einmal vor. Bei meinem A einmal, B zweimal und C dreimal, das wäre also insgesamt eine Verdoppelung. Das ist zwar nennenswert aber sicher nicht extrem. 😃 Und wie gesagt, kannst du den Pattern ja mit C# zusammenbauen, wodurch die Duplizierung zumindest nicht zu Redundanzen im Code führt.

Freut mich sehr, dass dir Regex-Lab so oft hilft. Für Mitleser hier noch der Link: On-the-fly Regex-Tester: Regex-Lab.

herbivore