Regex: Zeichenfolge darf nicht vorkommen

09/08/2008 - 04:59 von Stefan Rommel | Report spam
Hallo,
folgendes Problem:

2 beliebige Buchstaben (nur Kleinbuchstaben)
2 Ziffern
2 beliebige Buchstaben ausser "cd", "xy" und "tz"

z.B.
cd98ab ergibt true
aa11dc ergibt true
kr84cd soll false ergeben da die letzten zwei Buchstaben nicht die
Zeichenfolge "cd" sein darf

[a-z]{2}[0-9]{2}[a-za-z][^cd|^xy|^tz]

wàre meine Idee gewesen. Funktioniert aber nicht. ^cd prüft wohl nur ab
das kein c vorkommen darf. Aber wie gebe ich an, dass genau diese zwei
Zeichen in der Reihenfolge nicht vorkommen dürfen.

Hoffe das Problem ist klar. Und würde mich über Tips zur Lösung des
selbigen Freuen.

Gruss
Stefan
 

Lesen sie die antworten

#1 Helmut Waitzmann
09/08/2008 - 07:11 | Warnen spam
Stefan Rommel writes:

Hallo,
folgendes Problem:

2 beliebige Buchstaben (nur Kleinbuchstaben)
2 Ziffern
2 beliebige Buchstaben ausser "cd", "xy" und "tz"



Sollen die letzten zwei Buchstaben auch Kleinbuchstaben sein oder sind da
große erlaubt? Ich nehme im Folgenden an, dass Du da auch nur
Kleinbuchstaben erlauben willst.

z.B.
cd98ab ergibt true
aa11dc ergibt true
kr84cd soll false ergeben da die letzten zwei Buchstaben nicht die
Zeichenfolge "cd" sein darf

[a-z]{2}[0-9]{2}[a-za-z][^cd|^xy|^tz]



Willst Du »ë auch zu den Kleinbuchstaben rechnen? Dann reicht »[a-z]«
nicht. Dafür gibt es aber »[[:lower:]]«: alle Kleinbuchstaben.

Also beginnt es so:
[[:lower:]]{2}[0-9]{2}

[a-za-z]



ist dasselbe wie »[a-z]«.

[^cd|^xy|^tz]



ist dasselbe wie »[^cdtxyz|]«. Du suchst runde Klammern (gibt es nur bei
»extended regular expressions«).

wàre meine Idee gewesen. Funktioniert aber nicht. ^cd prüft wohl nur ab das
kein c vorkommen darf. Aber wie gebe ich an, dass genau diese zwei Zeichen
in der Reihenfolge nicht vorkommen dürfen.



Indem Du alle anderen Fàlle aufzàhlst: Alle Paare aus Kleinbuchstaben
außer der Zeichenfolge »cd« sind die Paare, die auf eine von den Regeln

* ein Kleinbuchstabe außer »c« gefolgt von einem weiteren
Kleinbuchtstaben

* ein »c« gefolgt von einem Kleinbuchstaben außer »d«

passen.

Leider kann man die Zeichenmenge »Kleinbuchstabe außer ›c‹ nicht direkt
angeben: Es gibt keine Mengensubtraktion in regulàren Ausdrücken, nur
Komplementbildung mittels »[^...]«. Also bleibt nur übrig, alle
verbotenen Zeichen(-mengen) aufzuzàhlen und das Komplement zu bilden:

ein Kleinbuchstabe außer »c«, »x« oder »t«:

[^cxt[:cntrl:][:space:][:digit:][:upper:][:punct:]]

ein Kleinbuchstabe außer »d«:

[^d[:cntrl:][:space:][:digit:][:upper:][:punct:]]

Damit:

ein Kleinbuchstabe außer »c«, »x« oder »t«, gefolgt von einem weiteren
Kleinbuchtstaben:

[^cxt[:cntrl:][:space:][:digit:][:upper:][:punct:]][:lower:]

ein »c« gefolgt von einem Kleinbuchstaben außer »d«

c[^d[:cntrl:][:space:][:digit:][:upper:][:punct:]]

Entsprechend sieht es für »xy« und »tz« aus.

Varianten zàhlt man mit »(Variante1|Variante2|Variante3)« auf.

Alles zusammengenommen (das muss alles in einer Zeile stehen):

[[:lower:]]{2}[0-9]{2}([^cxt[:cntrl:][:space:][:digit:][:upper:][:punct:]][[:lower:]]|c[^d[:cntrl:][:space:][:digit:][:upper:][:punct:]]|x[^y[:cntrl:][:space:][:digit:][:upper:][:punct:]]|t[^z[:cntrl:][:space:][:digit:][:upper:][:punct:]])
Wer mir E-Mail schreiben will, stelle | When writing me e-mail, please
bitte vor meine E-Mail-Adresse meinen | precede my e-mail address with
Vor- und Nachnamen, etwa so: | my full name, like
Helmut Waitzmann , (Helmut Waitzmann)

Ähnliche fragen