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
>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 <x...@example.net>, (Helmut Waitzmann) x...@example.net
Der Versuch Regexps umzukehren führt zu länglichen Ausdrücken. Da dein
Problem recht einfach ist hier mal einen Ansatz für solche Probleme:
Zur Abkürzung schreibe ich mal anstelle "[a-z][a-z][0-9][0-9]" ein "#":
ohne "cd" geht z.B. so:
#[a-bd-z][a-ce-z]
Haut aber "c." auch weg folgendes schließt das wieder ein ohne auch
"cd" wieder zuzulassen:
#c[a-ce-z]
Der Fall ".d":
#[a-bd-z]d
Und zusammenfügen mit oder:
(#[a-bd-z][a-ce-z]|#c[a-ce-z]|#[a-bd-z]d)
Ich hab das mal nicht weiter vereinfacht damit der Ansatz leichter
zu sehen ist. Dieser Ausdruck sollte nur matchen wenn kein "cd" am Ende
steht. Er matcht aber leider auch wenn "xy" oder "tz" am Ende sind. Es
braucht also etwas mehr Grips:
Zur Abkürzung: "L" steht für "a-bd-su-wy-z", "R" für "a-ce-x":
"[L]" an der 5. Stelle heißt der Ausdruck ist ok, "[R]" an der 6.
Stelle ebenfalls:
#[L][a-z]
#[a-z][R]
Auf den Ausdruck #[L][R] passende Strings sind damit bereits
eingeschlossen.
Für den Fall daß ein durch L und R ausgeschlossener Buchstabe dennoch
vorkommt braucht es weitere Regeln:
#c[Ryz]
#x[Rdz]
#t[Rdy]
#[Lxt]d
#[Lct]y
#[Lcx]z
Die alle ver-oder-n und ich hoffe es stimmt dann.
Wie du siehst bläht das wunderbar. In der Praxis vermeidet man sowas
lieber und verwendet etwas mächtigeres als Regexps.
> [a-z]{2}[0-9]{2}[a-za-z][^cd|^xy|^tz]
Huh? [^cd|^xy|^tz] erkenne ich gar nicht und [a-za-z] scheint mir
dasselbe wie [a-z] zu sein...
Grüße
- Robert Figura
--
/* mandlsig.c 0.42 (c) by Robert Figura */
I=1702;float O,o,i;main(l){for(;I--;putchar("oO .,\nt>neo.ckgel-t\
agidif@<ra urig FrtbeRo"[I%74?I>837&874>I?I^833:l%5:5]))for(O=o=l=
0;O*O+o*o<(16^l++);o=2*O*o+I/74/11.-1,O=i)i=O*O-o*o+I%74*.04-2.2;}
Da fehlt ein Zeichen: ^
Es bedeutet also dasselbe wie »[^cdtxyz|^]«
Dirk
>ein Kleinbuchstabe außer »c«, »x« oder »t«, gefolgt von einem weiteren
>Kleinbuchtstaben:
>
>[^cxt[:cntrl:][:space:][:digit:][:upper:][:punct:]][:lower:]
^ ^
da fehlen noch »[« und »]«,
damit es stimmt:
[^cxt[:cntrl:][:space:][:digit:][:upper:][:punct:]][[:lower:]]
>Alles zusammengenommen
stimmt dann aber.
> Wie du siehst bläht das wunderbar. In der Praxis vermeidet man sowas
> lieber und verwendet etwas mächtigeres als Regexps.
Was verwendet man dann?
Man ist ja lernfähig:-)
Gruß
Stefan
Etwas besseres als regex - z.B.:
grep -e '^[a-z][a-z][0-9][0-9][a-z][a-z]$' |
grep -v -e 'cd$' -e 'xy$' -e 'tz $'
Schließlich ist das hier dco.unix.shell