2012-03-29 30 views
0

Ok, also habe ich eine Phrase durch Leerzeichen begrenzt. Jedes Element kann nur eine Ganzzahl oder eine reelle Zahl sein, mit Ausnahme der letzten zwei Elemente, bei denen es sich um die Zeichenfolge null handeln kann. Mein regulärer Ausdruck istBrauchen Sie Klarstellung (Hilfe) mit regulärem Ausdruck

([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*) ([0-9]*\.[0-9]*|[0-9]*|null) ([0-9]*\.[0-9]*|[0-9]*|null) 

Ich verstehe nicht, warum in der Phrase

123 15 3 null null 

Die letzte Null nicht erfasst bekommt. Jemand erwähnte die Verwendung von '/' und sagte mir, dass sie wie Anführungszeichen für reguläre Ausdrücke seien, aber es schien mir, dass das Hinzufügen nur durch regulären Ausdruck nach dieser Zeichenkette suchen muss. Ich schreibe meinen regulären Ausdruck in dieser Form, weil ich es in Java implementiere und die Gruppen oder Elemente entsprechend trennen muss.

EDIT: Vielen Dank für die tollen Antworten. Natürlich brauche ich mehr Übung und wahrscheinlich etwas Schlaf! Mein regulärer Ausdruck sieht jetzt viel sauberer aus.

Expression Überarbeitete

(\d+\.\d+|\d+) (\d+\.\d+|\d+) (\d+\.\d+|\d+) (\d+\.\d+|\d+|null) (\d+\.\d+|\d+|null) 
+0

Sein, weil * bedeutet 0 oder mehr. In der Tat wird eine Zeichenfolge wie: "10 null" übereinstimmen (mit mehreren Leerzeichen zwischen 10 und null). – Ivan

Antwort

2

Es ist auf Grund der Art und Weise Sie Ihre oder Gruppen mit dem * Modifikator sind zu definieren:

([0-9]*\.[0-9]*|[0-9]*|null) 

Mit der obigen Aussage, ist es möglich, mit nichts entsprechen [0-9] *. Und es wird das zuerst übereinstimmen, wenn es möglich ist.

Wenn Sie 2 in Folge:

([0-9]*\.[0-9]*|[0-9]*|null) ([0-9]*\.[0-9]*|[0-9]*|null) 

Es ist nun die ‚Null‘ in der ersten Gruppe passen gezwungen, kann aber mit passend nichts in den zweiten wegzukommen.

Wenn Sie diese Einfanggruppen zu modifizieren waren:

([0-9]*\.[0-9]*|[0-9]+|null) 

Sie würden nicht in der Lage sein, ‚nichts‘ mehr passen, und würde den Weg in einer Reihe aufstellen Sie es wollen.

Sie können auch drehen Sie sich um und zwingen sie zu ‚Null‘ vor nichts zu entsprechen:

([0-9]*\.[0-9]*|null|[0-9]*) 
1

Wenn Sie immer das folgende Format erwarten:

Number Number Number Number|null Number|null 

Die folgende Regex wird es passen:

([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+) ([0-9]+\.[0-9]+|[0-9]+|null) ([0-9]+\.[0-9]+|[0-9]+|null) 

Der * bedeutet 0 oder mehr beträgt, while + bedeutet 1 oder mehr.

1

Die Dezimalgruppen für die reellen Zahlen müssen mit ? optional gemacht werden, und da die ganze Zahl nicht optional ist, verwenden Sie + anstelle von *.

(\d+(?:\.\d+)?) (\d+(?:\.\d+)?) ((\d+(?:\.\d+)?)|null) ((\d+(?:\.\d+)?)|null) 
+0

innere Gruppen sollten nicht übereinstimmen: (?: ...) – mabn

+0

@ mabn Bearbeitet, danke. –