regex optionale Gruppenerfassung von JAVA

8

Ich habe ein Muster, wo ein Benutzer spezifiziert:

%Vor%

trim und engine sind optional, falls vorhanden sollte ich sie erfassen; Wenn nicht, sollte der Matcher zumindest YMM validieren.

%Vor%

Das passt, wenn alle drei da sind, aber wie mache ich die letzten zwei und nur zwei Felder optional?

    
rad07 21.01.2014, 20:02
quelle

2 Antworten

5

Verwenden Sie einen regulären Ausdruck und ? , den "Null oder einen Quantifizierer"

Sie können ? verwenden, um die Null oder Eins von etwas zu finden, was Sie mit dem letzten Bit machen wollen. Allerdings benötigt Ihr Muster ein bisschen eine Modifikation, um mehr wie [^:]* anstatt .* zu sein. Ein Beispielcode und seine Ausgabe folgen. Der reguläre Ausdruck, mit dem ich endete, war:

%Vor%

Jedes a stimmt mit einer Folge von Nicht-Doppelpunkten überein (obwohl Sie das erste so anpassen möchten, dass es mit Jahren übereinstimmt), und b ist eine nicht erfassende Gruppe (startet also mit ?: ) und entspricht null oder einmal (weil es den letzten ? Quantor hat). Dies bedeutet, dass das vierte und fünfte Feld optional sind. Der Beispielcode zeigt, dass dieses Muster übereinstimmt, wenn drei, vier oder fünf Felder vorhanden sind, und nicht übereinstimmt, wenn mehr als fünf Felder oder weniger als drei Felder vorhanden sind.

%Vor% %Vor%

Obwohl es durchaus möglich ist, diese Art von String mit einem regulären Ausdruck zu vergleichen, scheint es einfacher zu sein, den String auf : zu teilen und zu überprüfen, wie viele Werte du zurückbekommst. Dies führt nicht notwendigerweise zu anderen Arten der Überprüfung (z. B. Zeichen in jedem Feld), so dass das Teilen möglicherweise nicht so nützlich ist, in welcher nicht-minimalen Situation dies auch motiviert.

Mit String.split und einem limit-Parameter

Ich habe deinen Kommentar zu einem anderen Beitrag gelesen, der die Verwendung von < a href="http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29"> String.split (String) (Hervorhebung hinzugefügt):

  

Ja, ich kenne diese Funktion, aber sie funktioniert, weil ich eine Zeichenfolge habe   was ist a: b: c: d: e: f: g: h .. aber ich möchte nur die Daten als gruppieren   a: b: c: d: e falls eins wie eins und der Rest der Zeichenkette als eine andere Gruppe

Es ist erwähnenswert, dass es eine Version von split gibt, die einen weiteren Parameter akzeptiert, String.split (String, int) . Der zweite Parameter ist ein Grenzwert, der wie folgt beschrieben wird:

  

Der Parameter limit steuert die Anzahl der Muster   angewendet und wirkt sich daher auf die Länge des resultierenden Arrays aus. Ob   das Limit n ist größer als Null, dann wird das Muster bei angewendet   Most n - 1 Mal ist die Länge des Arrays nicht größer als n und   Der letzte Eintrag des Arrays enthält alle Eingaben, die über die letzte Übereinstimmung hinausgehen   Trennzeichen. Wenn n nicht positiv ist, wird das Muster als angewendet   so oft wie möglich und das Array kann eine beliebige Länge haben. Wenn n Null ist   Dann wird das Muster so oft wie möglich auf das Array angewendet   kann eine beliebige Länge haben und nachfolgende leere Zeichenfolgen werden verworfen.

Dies bedeutet, dass Sie split und das Limit 6 verwenden können, um bis zu fünf Felder aus Ihrer Eingabe zu erhalten, und Sie haben die verbleibende Eingabe als letzte Zeichenfolge. Sie müssten immer noch überprüfen, ob Sie mindestens drei Elemente haben, um sicherzustellen, dass genügend Eingaben vorhanden sind, aber alles in allem scheint es etwas einfacher zu sein.

%Vor% %Vor%     
Joshua Taylor 21.01.2014, 20:06
quelle
0

Überspringen Sie den Regex und verwenden Sie split(":") . Scheint einfach zu sein. Aus der Länge des resultierenden Arrays wissen Sie dann, ob Modell und Engine usw. bereitgestellt wurden.

%Vor%

Bearbeiten: Wie andere bereits erwähnt haben, verwendet String.split ebenfalls ein Regex-Muster. In meiner Meinung ist das aber nicht wirklich wichtig. Um eine wirklich regex-lose Lösung zu haben, benutzen Sie StrwingUtils.split von Apache Commons (die keinen Regex benutzen):)

    
kmera 21.01.2014 20:13
quelle

Tags und Links