Sven Rautenberg: REGULÄRE AUSDRÜCKE - Ich werd' noch zu Profi ;-)

Beitrag lesen

Aloha!

Manche Leute suchen dann einfach nach "ei", und sehen die Nicht-Treffer als Treffer... so per Programm-Logik.
ja, so etwas habe ich auch schon gedacht, aber dann brauche ich zwei Suchvorgänge richtig? Ich muß ja das Andere (z.B. ganze Wörter) auch suchen und dann von diesen gefundenen diejenigen aussondern, die
'ei' enthalten...
scheint mir etwas umständlich. Weiß jemand, ob das 'Standard' ist?

Stell dir vor, es ist Ostern und in einem großen Garten (der nicht überschwemmt ist) sind angeblich Eier versteckt. Du sollst nun sagen, ob das stimmt, oder nicht.

Naja, offenbar sind dann keine Eier im Garten, wenn du kein "ei" findest. Dazu mußt du aber erstmal nach einem "ei" suchen. Wenn du eines findest, sind wohl Eier versteckt, wenn nicht - dann sind wohl keine Eier versteckt.

Auf den regulären Ausdruck bezogen:
[abc] definiert eine Zeichenklasse - die steht für _ein_ einzelnes Zeichen, welches in der Klasse angegeben ist.
[^abc] steht für ein Zeichen, welches dort nicht angegeben ist.
[e][i] steht für zwei Zeichen, die in dieser Reihenfolge kommen müssen.
[^e][^i] steht für zwei Zeichen, die in dieser Reihenfolge nicht kommen dürfen.

Naja, wenn man das letzte Beispiel mal umsetzt:
[^e][^i] - Das kann nur bei Strings passen, die genau zwei Zeichen lang sind. Wenn die nicht "ei" heißen, stimmt der reguläre Ausdruck. Das ist natürlich doof, denn das ist schneller mit
if ($string !="ei")
geprüft.

Vor und hinter dem "ei" dürfen also noch beliebige Zeichen kommen:
.*[^e][^i].*
Wenn wir jetzt mal den String "Brei" nehmen: Da ist "ei" drin, aber der reguläre Ausdruck wird behaupten, daß kein "ei" drin sei. Die Zuordnung des Strings wird so laufen:

.*   wird das B erkennen
[^e] wird das r erkennen
[^i] wird das e erkennen
.*   wird das i erkennen

Und selbst im String "eieieieieieieiei" wird der Ausdruck behaupten, daß kein "ei" drinsei:

.*   wird "eieieie" (oder so) erkennen
[^e] wird "i" erkennen
[^i] wird "e" erkennen
.*   erkennt den Rest vom String.

Mit anderen Worten: Finde "ei" - wenn du ei finden wolltest, tue das eine, wenn du kein "ei" finden wolltest, tue das andere.

- Sven Rautenberg