Java String regex

Tockra

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.063
Hey Leute,

Kann mir jmd. bei dem Regulären Ausdruck für den String helfen?
Code:
if(!command.matches("/reservate [3[0-1]|[1-2][1-9]|0[1-9]] [0[1-9]|1[0-2]] [0-24] [0-24] [1-5000] [true|false] [\\p{Punct}\\wäöüÄÖÜ]*")/*inputWords.length < 8*/) {
				println("Geb bitte /reservate <day> <month> <from> <to> <room> <open> <comment> ein!");
				break;
			}

Ich hoffe das println erklärt was ich möchte (Raumnummern sind irgendwo zwischen 1 und 5000
 
Mach es dir doch nicht so schwer. Einfach splitten am Leerzeichen und dann die Länge der Liste und jede Position einzeln validieren. Das in eine Methode rausziehen und schon ist das viel besser verständlich, als wenn du dir da eine komplizierte Regex bastelst, an der du ewig rumfrickeln musst. Wartbarkeit ist wichtig.

Wenn du es schön machen möchtest, baust du dir ein Objekt, das diesen Eingabestring im Konstruktor empfängt und seine Felder dann (inkl. Validierung) befüllt. Dann kannst du es auch schön weiterverwenden.
 
Siehe Tumbleweed. Ansonsten scheint bei dir ein Missverständnis hinsichtlich der Charakter-Klassen zu existieren. [0-24] (und analog [1-5000]) bedeutet etwas völlig anderes, als du dir vorstellst. Die gängigen Regex-Implementierungen arbeiten schlicht auf Zeichen und kennen keine Zahlen im eigentlichen Sinne. [0-24] matcht dir also nicht eine Zahl zwischen 0 und 24, sondern eine Zahl zwischen 0 und 2 sowie die 4.

e-Funktion schrieb:
Ich gebe allgemein zu bedenken, dass Regex hinsichtlich der Performance mit vorsicht zu genießen ist.

Das stimmt zwar, ist bei vielen Einsatzgebieten aber zu vernachlässigen. Der TS scheint beispielsweise eine Art Eingabekonsole bauen zu wollen, da wird das vermutlich nichtmal messbar sein.
 
Zuletzt bearbeitet:
Du kannst auch einfach Zahlen selektiern und dann auf erst auf den Wertebereich prüfen.

z.B.:
(\d{1,4})
 
e-Funktion schrieb:
Ich gebe allgemein zu bedenken, dass Regex hinsichtlich der Performance mit vorsicht zu genießen ist.
Wenn der Ausdruck einmal ausgewertet ist, hat Regex-Matching eigentlich lineare Laufzeit im Bezug auf den zu testenden String.

Edit: Wobei es natürlich von der jeweiligen Implementierung abhängt, aber selbst mit nicht-deterministischen Automaten muss man sich schon anstrengen, einen Ausdruck zu finden, der gleichzeitig in so vielen Zuständen sein kann, dass die Performance spürbar leidet.

Nebenbei wäre es auch gut zu wissen, wo denn das Problem ist. Aber wenn ich raten darf:
Code:
[1-5000]
Damit matchst du die Zahlen 0, 1, 2, 3, 4, 5. Sonst nichts. Warum? Weil [] eine Menge erlaubter Zeichen angibt, kein Intervall von Zahlen. Deswegen ist Regex zum Auswerten numerischer Eingaben auch völlig ungeeignet.

Edit: Siehe crvn075s Antwort, er war schneller.
 
Zuletzt bearbeitet:
Um das nochmal klar zu stellen, was oben geschrieben wurde heißt nicht, dass man Zahlenbereiche nicht mit Regex erkennen kann. Es ist nur nicht intuitiv und auch schwer wartbar. Wenn du bei regulären Ausdrücken bleiben wollen würdest, könntest du den Bereich 0-24 mit

([0-9]|1[0-9]|2[0-4])

und den Bereich 1-5000 mit

([1-9][0-9]{0,2}|[1-4][0-9]{3}|5000)

abdecken. Du siehst selbst, warum das eher suboptimal ist.
 
Zurück
Oben