# Regex mit UND-Verknüpfung



## SimProtect (8. Feb 2016)

Hallo Leute,

Mein Team arbeitet derzeit an einem Problem, bei welchem es um ein - gefühlt - uraltes Nachrichtenschema geht, das baumartig aufgebaut ist. Hierbei verfügen jeweils die letzten Knoten (diejenigen also, die keiner Kindknoten mehr haben) über reguläre Ausdrücke, die für eben diesen Knoten gelten - jene letzte Knoten repräsentieren im wesentlichen bestimmte Aspekte einer Nachricht (z.B. Vorname, Nachname oder Straßenname).
Verschiedene Aspekte können in einem übergeordenten Datentyp zusammengefasst sein (einfaches Beispiel anhand einer Adresse: Sie besteht aus den Einzelaspekten Straßenname, Hausnummer, PLZ, Stadt).

Auf bestimmten Gründen - auf die ich jedoch hier nicht näher eingehen möchte und auf weder mein Team, noch ich Einfluss haben - muss es nun im übergeordneten Datentyp einen zusammengefassten Regex aus den regulären Ausdrücken aller Unteraspekte geben.
Auch das schief auf den ersten Blick sehr einfach: Wir haben uns alle regulären Ausdrücke der Aspekte geben lassen und diese gruppiert aneinander gereiht. Funktionierte in den ersten Tests super!

Nun stehen wir aber vor dem Problem, dass die Einzelaspekte teilweise über MEHRERE reguläre Ausdrücke verfügen, die BEIDE erfüllt sein müssen (diejenigen, die uns die Schemadateien geschrieben haben, sind vermutlich durch die Anforderungen für das jeweilige Elemente gegangen und haben für jede Anforderung einen Regex erstellt - wie gesagt: wir haben keinen Einfluss darauf und können am Schema nichts ändern. Ebenso sind uns Teile der technischen Umsetzung vorgegeben). Teilweise widersprechen sich diese Ausdrücke auch in einigen Teilen recht Stark (beispiel: Der erste Regex sagt, es darf sich um eine genau dreistellige Zahl handeln und es darf optional ein Minuszeichen vorkommen - der zweite Regex sagt: Es dürfen beliebig viele Ziffern vorkommen, aber kein Vorzeichen)

Nun wissen wir, dass das keine herkömliche Und-Verknüpfung in regulären Ausdrücken gibt. Dennoch müssen wir im übergeordneten Element aus allen regulären Ausdrücken einen einzigen Regex erstellen.
Momentan sehen unsere kombinierten Regexe noch so aus (als wir davon ausgegangen waren, es gäbe lediglich einen pro Aspekt): "(?<Groupname1> Regex1)(?<Groupname2> Regex2) [...]"

Fällt hier jemandem eine Lösung ein, mit der sich zwei reguläre Ausdrücke (z.B. für die Gruppe 1) quasi als UND verknüpfen lassen?

Unsere Alternativlösung wäre den Regex quasi im Hintergrund durch eine eigene Implementierung der geforderten Logik zu ersetzen und nur nach Außen hin weiter mit der Regexlogik zu arbeiten. Jedoch wäre das ein bedeutend größerer Aufwand, der auch mehr Zeit verschlingen würde, als uns im aktuellen Sprint zugesprochen wurde.

Beste Grüße
Der SimProtect


----------



## kneitzel (8. Feb 2016)

Also bei regulären Ausdrücken gibt es keine UND Verknüpfung. Das einzige, das mir hier einfallen würde, wäre die Erstellung eines Ausdrucks aus den zwei Ausdrücken, in dem dann das Resultat aus den zwei Ausdrücken steckt.

Das mag für einfache reguläre Ausdrücke einfach sein, aber bei einer hohen Komplexität kann es durchaus schwer bis unmöglich werden.

Einfaches Beispiel wäre z.B. [abc]{3} und [abd]*.
Zum einen ist klar: Länge muss genau 3 sein und es kann nur a und b geben: [ab]{3} 
Das wäre dann sozusagen die "und Verknüpfung".

Und die Frage ist dann tatsächlich, in wie weit das Design noch tragbar ist, wenn solche komplexen Dinge notwendig werden. Zumal die regulären Ausdrück mit höherer Komplexität immer fehleranfälliger werden und kaum noch zu warten sein dürften.

Sorry, dass ich Dir nicht besser weiter helfen konnte, aber ich fürchte fast, dass es da keine simple Lösung für euch gibt.

Konrad


----------

