Aufzählung Mögliche Übereinstimmungen von regulären Ausdrücken in Java

9

Ich möchte alle möglichen Werte eines endlichen regulären Ausdrucks in Java zu Testzwecken aufzählen.

Für einen Kontext habe ich einen regulären Ausdruck, den ich verwende, um zulässige Farbwerte in Wörtern zu finden. Hier ist eine verkürzte Version davon als Beispiel:

%Vor%

Ich wollte einen Komponententest erstellen, der all diese Werte aufzählt und jeden von ihnen an meine Utility-Klasse übergibt, die daraus ein Color -Objekt erzeugt. Wenn ich also den regulären Ausdruck ändere, werden meine Unit-Tests fehlschlagen ein Fehler tritt auf (dh der neue Farbwert wird nicht unterstützt).

Ich weiß, dass eine Aufzählung natürlich möglich ist ( siehe diese Frage ), aber gibt es eine vorhandene Bibliothek für Java, die alle möglichen Übereinstimmungen für eine Regex aufzählt?

Bearbeiten: Ich habe eine Bibliothek implementiert, die dies tut. Siehe meine Antwort unten für Links.

    
Brian 03.12.2012, 17:42
quelle

2 Antworten

3

Sie haben Recht, haben ein solches Tool auch nicht online gefunden aber Sie können Xeger von Google

ausprobieren

es kann eine zufällige übereinstimmende Zeichenkette von einem Regexp erzeugen, und mit irgendeinem Code, der tweaking macht, können Sie tun, was Sie wollen. zufällige Übereinstimmung erzeugen:

%Vor%

Xeger Code ist sehr einfach, besteht aus 2 Dateien, die 5 Methoden zwischen ihnen enthalten ..
Es verwendet dk.brics.automaton, um die Regex zu einem Automaten zu konvertieren, und geht dann über die Automatenübergänge, wobei zufällige Auswahlen in jedem Knoten getroffen werden.

Die Hauptfunktion ist generate:

%Vor%

Sie können sehen, dass, um es so zu ändern, dass Sie alle möglichen Übereinstimmungen erhalten, Sie über alle möglichen Kombinationen in jedem möglichen Knoten iterieren müssen (wie das Erhöhen eines mehrstelligen Zählers) Sie benötigen einen Hash, um Schleifen zu verhindern, aber das sollte nicht länger als 5 Sekunden dauern.

Ich würde auch vorschlagen, zuerst zu überprüfen, dass die Regex tatsächlich Finate ist, indem Sie überprüfen, dass es nicht *, + und andere Symbole hat, die diese Aktion unmöglich machen (nur um dies zu einem vollständigen Werkzeug für die Wiederverwendung zu machen) ...

    
Amitbe 05.12.2012, 13:08
quelle
0

Für zukünftige Browser, die zu dieser Frage kamen, schrieb ich eine Bibliothek, die dk.brics.automaton mit einem ähnlichen Ansatz verwendet Xeger aus der angenommenen Antwort und veröffentlichte es. Sie können es finden:

Um es als Abhängigkeit hinzuzufügen:

Maven

%Vor%

Gradle

%Vor%

Beispielcode

Verwenden Sie diese Frage als Beispiel:

%Vor%     
Brian 12.12.2017 22:03
quelle

Tags und Links