Ich habe versucht, eine Regex zu schreiben, die den Importen einer Klasse entspricht. Lass die Klasse
sein %Vor%Die Ausgabe sollte [org.junit.Assert. *, org.package.Test, mypackage.mystuff] sein. Ich habe mit den Zeilenumbrüchen und regulären Ausdrücken im Allgemeinen gekämpft, da ich nicht so erfahren bin. Dies ist mein aktueller Versuch:
%Vor% Diese Regex sollte für alle Arten von Importanweisungen funktionieren und nicht mit ungültigen Anweisungen übereinstimmen:
import\p{javaIdentifierIgnorable}*\p{javaWhitespace}+(?:static\p{javaIdentifierIgnorable}*\p{javaWhitespace}+)?(\p{javaJavaIdentifierStart}[\p{javaJavaIdentifierPart}\p{javaIdentifierIgnorable}]*(?:\p{javaWhitespace}*\.\p{javaWhitespace}*\*|(?:\p{javaWhitespace}*\.\p{javaWhitespace}*\p{javaJavaIdentifierStart}[\p{javaJavaIdentifierPart}\p{javaIdentifierIgnorable}]*)+(?:\p{javaWhitespace}*\.\p{javaWhitespace}*\*)?))\p{javaWhitespace}*;
Es werden häufig Java-Kategorien verwendet, z. \p{javaWhitespace}
ruft Character.isWhitesspace auf:
Kategorien, die sich wie der java.lang.Character Boolean verhalten
ismethodname
-Methoden (außer den veralteten) sind über dieselbe\p{prop}
-Syntax verfügbar, wobei die angegebene Eigenschaft den Namenjavamethodname
hat.
Immer noch nicht lesbar? So geahnt. Deshalb habe ich versucht, es mit Java-Code ( REGEX
) auszudrücken:
Ich verwende eine Gruppe für den package.Class
-Teil und ersetze dann jedes Rauschen aus den Übereinstimmungen.
Die Testeingabe ist die folgende Zeichenfolge ( IMPORTS
):
Die Ausgabe:
%Vor%Das passt (fast) zu Ihren Bedürfnissen:
%Vor%
Fast, weil die Übereinstimmungen die neuen Zeilen enthalten (z. B. in Ihrer org.package.Test-Deklaration). Dies sollte danach behandelt werden:
%Vor% In Java \s
entspricht [ \t\n\x0B\f\r]
. Werfen Sie einen Blick auf Possessivquantifizierer , um den ?+
Quantifizierer zu verstehen.