s.oliver: Regex immer mal wieder

Beitrag lesen

Servus,

Das liegt aber auch daran, dass es wirklich keine
gute Dokumentation, bzw gutes Tutorial darüber gibt.

eine erstklassige Lektüre ist "Mastering Regular Expressions" von Jeffrey E. F. Friedl; erschienen ist der Band (aktuell in der zweiten Edition, wenn ich mich recht erinnere) bei O'Reilly.

Dann will ich zb alles finden zwischen "" was "atz" drin hat.
Das heisst die katzen würde ich bekommen.

[...]

$reg = !".*[atz]"!is  Dann muss atz auftauchen

Nein, viel einfacher - '/"[^"]+atz[^"]*?"/is' findet den Abschnitt innerhalb des Strings, welcher mit '"' beginnt, 'atz' enthält und auf '"' endet, wobei innerhalb des Ergebnisses nur Zeichen liegen dürfen, die nicht '"' entsprechen (ganz einfach um das "kürzeste" Ergebnis zu bekommen). [^"] ist eine Charakterklasse, gekennzeichnet durch '[]', welche nur '"' nicht '^' enthält - das Caret sorgt dafür, dass alle aufgelisteten Zeichen innerhalb der Klasse nicht gefunden werden dürfen, wenn es direkt hinter der öffnenden Klammer steht.

Dein Fehler war in diesem Moment, dass [atz] eine Charakterklasse ist, d.h. verbal: "Finde entweder ein 'a', ein 't' oder ein 'z'" und keine feste Zeichenkette - du willst aber 'atz' nur als feste Zeichenfolge finden, und musst sie deshalb auch (einfach) so schreiben.

Noch ein Wort zur Quantifizierung in meinem Beispiel: '/"[^"]+atz[^"]*?"/is' - '[^"]+' vor 'atz' bedeutet, "mindestens ein (und so viel wie möglich) Zeichen, welches nicht '"' entspricht", so gewählt, da die Katze ohne das K recht arm dastehen würde (zumal, wenn es denn eine Tigerkatze oder ähnliches ist); das '[^"]*?' nach 'atz' steht für "kein oder so wenig wie möglich Zeichen, die nicht '"' entsprechen", da 'Katz' als Möglichkeit für mich nicht auszuschliessen ist.

Grüsse