PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Regulärer Ausdruck gesucht


Grestorn
2008-03-14, 13:33:23
Normalerweise habe ich kein großes Problem einen passenden RegEx zu finden, aber an dem den ich jetzt brauche, beiße ich mir die Zähne aus.

Es geht um eine Validierung einer Eingabe. Die wird mit der Java-Methode String.matches() gegen einen RegEx auf Gültigkeit getestet.

Zunächst sollen alle nicht druckbare Zeichen, sowie alle Sonderzeichen bis auf speziell angegebene (: / . , ( ) " ' - _ und @) verboten sein. Zahlen, Buchstaben und alle Umlaute sowie alle Zeichen, die nicht zum 7-bit Ascii gehören, sollen aber erlaubt sein.

Das ist noch recht einfach, hier der Ausdruck, den ich verwende:

[\:\/\.\,\(\)\"\'\-\_\@[^\p{Cntrl}\p{Punct}]]*

Jetzt soll aber zwar ein einzelnes - (Minuszeichen) weiterhin erlaubt bleiben, eine Folge von mindestens 2 aufeinanderfolgenden - aber verboten sein. Sonst bleibt alles beim alten.

Wer hat ne Idee?

Monger
2008-03-14, 14:10:20
Sitz ich auf dem Schlauch? Sollte das nicht einfach:

[\:\/\.\,\(\)\"\'[\-\-]*\_\@[^\p{Cntrl}\p{Punct}]]*

sein?

Grestorn
2008-03-14, 14:15:56
Sitz ich auf dem Schlauch? Sollte das nicht einfach:

[\:\/\.\,\(\)\"\'[\-\-]*\_\@[^\p{Cntrl}\p{Punct}]]*

sein?

Ne, das ist es nicht. In [] Klammern werden ja Zeichenmengen definiert. Du definierst zusätzlich eine Zeichenmenge als erlaubt, die aus - besteht (es ist egal ob Du das Zeichen 1 oder 2 mal in der Zeichenmenge einschließt).

Ich will ja das einzelne - Zeichen irgendwo im String erlaubt sind, unmittelbar aufeinanderfolgende - Zeichen, also -- oder --- usw. sollen aber verboten sein.

Monger
2008-03-14, 14:34:52
Dann vielleicht:

[-{2}\:\/\.\,\(\)\"\'\_\@[^\p{Cntrl}\p{Punct}]]*

?

Geschweifte Klammern zeigen ja Wiederholungen. Aber das muss eigentlich auch noch anders gehen...

Edit: muss möglicherweise ganz an den Anfang der Gruppe...

Xmas
2008-03-14, 15:13:30
Wenn X die Gruppe der erlaubten Zeichen außer '-' ist, sollte der Ausdruck etwa so aussehen:
( X | (- (X | Ende)))*

Grestorn
2008-03-14, 19:44:41
Wenn X die Gruppe der erlaubten Zeichen außer '-' ist, sollte der Ausdruck etwa so aussehen:
( X | (- (X | Ende)))*

Das müsste gehen, ja. Wird aber ein extrem ätzender Ausdruck. Ich hatte gehofft, dass es eine Lösung gibt ohne dass man die erlaubte Zeichengruppe zweimal angeben muss.

Danke auf jeden Fall!

Coda
2008-03-14, 19:53:10
In solchen Momenten ist es auch manchmal besser auf Regexps zu verzichten...

Grestorn
2008-03-14, 20:06:13
In solchen Momenten ist es auch manchmal besser auf Regexps zu verzichten...

Das hatte ich mir auch schon gedacht. Wäre in diesem Fall aber schade, da dann die generische, auf RegEx basierende Validierung nicht nutzbar wäre.

Naja, alles im Leben hat seine Schattenseiten... :)

Grestorn
2008-03-14, 20:10:06
Dann vielleicht:

[-{2}\:\/\.\,\(\)\"\'\_\@[^\p{Cntrl}\p{Punct}]]*

?

Geschweifte Klammern zeigen ja Wiederholungen. Aber das muss eigentlich auch noch anders gehen...

Edit: muss möglicherweise ganz an den Anfang der Gruppe...

Der Vollständigkeit-halber: Ich glaube nicht, dass sich ein Mengenoperator innerhalb einer Zeichenmenge nutzen lässt. Ich wüsste nicht, was das für einen Sinn machen sollte.

Und selbst wenn, dann würden in Deinem Beispiel bestenfalls nur mindestens -- oder ---- usw. erlaubt sein. Also vielfache von 2 - Zeichen. Das * am Ende des Ausdrucks führt ja dazu, dass jede Kombination jeder der Zeichen innerhalb der Menge erlaubt ist.

Das macht es ja so schwierig.

Xmas
2008-03-14, 20:57:10
Das müsste gehen, ja. Wird aber ein extrem ätzender Ausdruck. Ich hatte gehofft, dass es eine Lösung gibt ohne dass man die erlaubte Zeichengruppe zweimal angeben muss.
(-?X)*-?

Grestorn
2008-03-14, 21:14:56
(-?X)*-?

Da hätte ich auch selbst draufkommen können... ich roste!

Vielen dank, super! :D