Johannes Zeller: Regulärer Ausdruck gesucht

Beitrag lesen

Hallo Toni,

erstmal was Allgemeines. Sind reguläre Ausdrücke in allen Scriptsprachen gleich oder ähnlich?

Es gibt verschiedene Systeme regulärer Ausdrücke, die häufigstens sind perl-kompatible reguläre Ausdrücke (PCRE) und reguläre Ausdrücke nach POSIX (in PHP durch die ereg-Funktionen verwendbar).

Wenn ich in einem Text die Zeilen zeilenweise durchsuche und die Zeile des Musters

[Tab oder Leerzeichen oder beides]Kunde123[Leerzeichen]50666[Leerzeichen]Köln

identifiziere und möchte durch eine Replace-Anwendung der entsprechenden Scriptsprache ausschließlich "Kunde123" erhalten, wie müßte dann z.B meine str_replace-Zeile in php heißen?

Mit str_replace() kommst du hier wahrscheinlich nicht weiter, da musst du schon preg_replace() zur Hilfe nehmen.

Zu bedenken ist, daß es ja auch Kunden mit anderer PLZ in Köln gibt, sowie, daß es Kunden mit dem String "Köln" im Namen geben könnte, also z.B. der Kunde "Kölner Baustoffe" oder sowas...

Willst du jede Zeile durch den Namen des Kunden ersetzen?

preg_replace('/^(?: |\t| \t|\t )([^ ]+) \d{5} .+$/', "$1", $zeile);

(?: |\t| \t|\t ) matcht entweder _ein_ Leerzeichen oder _einen_ Tabulator, oder ein Leerzeichen und einen Tabulator oder einen Tabulator und ein Leerzeichen. ?: sagt dem Parser, dass er sich den Ausdruck in der Klammer nicht merken soll.

Vermutlich willst du stattdessen sowas wie [ \t]+, dies passt auf eine beliebig lange Folge von Leerzeichen und Tabulatoren, mindestens aber ein Leerzeichen oder ein Tabulator.

([^ ]+) steht für eine beliebige Anzahl von Zeichen, die kein Leerzeichen sind; es muss aber mindestens ein solches Zeichen an dieser Stelle vorkommen. Die Klammerung bedeutet, dass sich der Parser den durch dieses Muster bezeichneten String merkt.

\d{5} bezeichnet genau fünf hintereinanderfolgende Ziffern (0-9)
.+ eine beliebige Anzahl (jedoch mindestens eins) beliebiger Zeichen.

Durch ^ am Anfang und $ am Ende wird ausgedrückt, dass das Muster auf die komplette Zeile zutreffen muss. Bei der Ersetzung wird mit "$1" auf den String der zweiten Klammer, in diesem Falle ja der Name des Kunden, zurückgegriffen (da die erste Klammer mit ?: ignoriert wird, ist die zweite für den Parser sozusagen die erste Klammer ;-) Deswegen $1 statt $2).

Schöne Grüße,

Johannes