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.
Das passt, wenn alle drei da sind, aber wie mache ich die letzten zwei und nur zwei Felder optional?
?
, 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:
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.
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.
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% Ü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.
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):)