Hallo!
\S*a\S*
und
[a-z]*[a][a-z]*… liefern bei mir identische Ergebnisse.
Aber nicht bei Wörtern wie „5-fach“ oder „nimm2“.
\s steht für ein sog. Whitespace, z.B. Leerzeichen, Tabs.
\S steht für alles aus \s, ist also die Umkehrung.
Ich sehe noch nicht mal ansatzweise eine Ähnlichkeit.
„Wort“ mit genau einem a:
(^|\s)[^a\s]*a[^a\s]*(?=(\s|$))
Das Blöde ist, dass ein Wort eben nicht nur von Leerzeichen eingeschlossen sein kann, sondern auch am Anfang oder am Ende stehen kann. Wenn wir jetzt einfach mal unseren Text vorne und hinten vorher um ein Leerzeichen ergänzen würden - kann man ja machen - wäre der Regexp schon deutlich einfacher.
\s[^a\s]*a[^a\s]*\s
Liest sich: ein Leerzeichen (eigentlich Whitespace), gefolgt von einer beliebigen Anzahl von Zeichen, die kein Leerzeichen oder „a“ sein dürfen, gefolgt von einem „a“, gefolgt von wieder einer beliebigen Anzahl von Zeichen, die kein Leerzeichen oder „a“ sein dürfen, gefolgt von einem Leerzeichen.
Das auf z.B. " einsa azwei drai " angewandt (man beachte die Leerzeichen am Anfang und Ende), sollte " einsa ", " azwei " und " drai " liefern. Sollte, erkennt aber nur " einsa " und " drai ". Warum? Weil nach dem Erkennen von " einsa " der ‚Lesezeiger‘ (keine Ahnung, wie man den richtig nennt) hinter dem erkannten Teil steht, also vorm „a“ von „azwei“. Das ist dumm, denn unser Regexp verlangt als erstes ein Leerzeichen (\s), das aber schon hinter uns liegt. Und so wird erst wieder " drai " erkannt.
Und da kommt jetzt dieses (?=\s) zum Einsatz (\s[^a\s]*a[^a\s]*(?=\s)). Das nennt sich Lookahead (Vorgriff) und bewirkt, dass für das erkannte Leerzeichen der Zeiger nicht weitergerückt wird, sondern quasi die Regexp-Engine einen langen Hals macht und guckt, ob dann denn vielleicht ein Leerzeichen kommt. Wenn ja, bleibt aber der Zeiger, wo er war, also vorm Leerzeichen und " azwei " kann erkannt werden.
Und das kann Jemand lesen und verstehen?
Das schaffe ich nie.
Ok, das ist natürlich alles auf einmal viiiiiel zu viel. Lookahead habe ich sicherlich lange nicht genutzt, weil nicht gekannt. Wir waren in der IT-Ausbildung gezwungen, den vi, den du ja kennst, zu benutzen. Wir alle haben gestöhnt. Da hab ich mir gesagt, das Teil lernst du jetzt, besonders so Sachen, wie „Suchen und Ersetzen“. Das war der Einstieg ins Thema Regexp, aber kein Einstieg von heute auf morgen.
Jan