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?
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
bestehenDann 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.
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.