Validierung des mathematischen Sets mit regulärem Ausdruck

8

Ich muss einen angegebenen Benutzer validieren und validieren, dass es ein gültiges Set ist, möglicherweise ein Set, das innere Mengen enthält. Beispiele:

%Vor%

Dies ist die Regex, die ich benutze (aus Gründen der besseren Lesbarkeit):

%Vor%

Momentan akzeptiert es Sets mit optionalen öffnenden und schließenden Klammern, aber ich brauche es nur zu akzeptieren, wenn beide da sind, und nicht, wenn einem inneren Set eine Klammer fehlt. In meiner aktuellen Implementierung wird das vierte Beispiel als gültige Menge akzeptiert.

Wie kann ich das erreichen?

    
unmuse 31.10.2012, 18:41
quelle

3 Antworten

4

Hier finden Sie einen Java-Pseudocode, mit dem Sie dieses Problem lösen können, ohne schwergewichtige Tools wie ANTLR zu verwenden. Der grundlegende Ansatz besteht darin, die Eingabe in Token zu teilen, die aus

bestehen
  1. Eine einzelne offene oder geschlossene Klammer
  2. Ein Komma
  3. Whitespace
  4. Ein Bezeichner

Dann scannen Sie durch die Token und behalten dabei die Verschachtelungsebene im Auge. Wenn am Ende die Verschachtelungsebene nicht Null ist, hat die Eingabezeichenfolge eine unausgewogene Klammer.

%Vor%

Sobald Sie dieses Framework installiert haben, können Sie es verbessern, um Dinge wie zwei Kommas hintereinander zu erkennen: Setzen Sie ein Flag, wenn Sie ein Komma sehen, löschen Sie das Flag, wenn Sie einen Bezeichner sehen (aber kein Leerzeichen). In der Verzweigung für Komma und Klammer schließen testen Sie das Flag und geben eine Fehlermeldung aus, da ein Komma zu diesem Zeitpunkt nicht gültig ist. Und so weiter, für welche Validierung Sie auch immer brauchen.

Beachten Sie, dass mein Pseudocode keine vollständige Lösung ist, sondern nur dazu gedacht ist, Ihnen den allgemeinen Ansatz zu geben. Eine vollständige Lösung wäre etwas komplizierter, da sie mit ungültigen Zeichen umgehen müsste, wodurch der Lexer (der Teil, der die Zeichenfolge in Token aufteilt) komplexer wird.

    
Jim Garrison 31.10.2012, 18:55
quelle
3

Wegen Ihrer Verwendung von passenden Klammern reicht eine einfache Regex-Grammatik nicht aus. Sie müssen in sogenannte kontextfreie Grammatiken schauen. Ich empfehle, in ANTLR zu schauen, aber es wird eine viel schwerere Lösung sein, als Sie dachten, Sie würden brauchen.

    
Joe 31.10.2012 18:48
quelle
0

Ein einfacher Weg wäre, nach dem letzten '{', dann dem '}' zu suchen, das unmittelbar folgt. Stellen Sie dann sicher, dass der Text dazwischen gültig ist (sollte eine kommagetrennte Liste sein). Ersetzen Sie dann die gesamte Zeichenfolge (von '{' bis '}' durch einen Dummy-Wert, z. B. 0. Wiederholen Sie das so lange, bis Sie mit 0 zurückbleiben oder ein Fehler auftritt.

    
Darren 31.10.2012 19:01
quelle

Tags und Links