Reguläre Ausdrücke (Teil 1)

Reguläre Ausdrücke sind eine Wissenschaft für sich, aber in vielen Situationen einfach unverzichtbar. Ich bin daher der Meinung, dass man sie lernen muss, auch wenn es ein wenig Überwindung kostet und man sich immer wieder fragt, ob man dafür nicht einfach zu alt ist. Es ist vermutlich wie mit Latein – wenn man es einmal verstanden hat, wird man ein Leben lang davon protifieren. Die PowerShell-Hilfe gibt bereits einen guten Überblick, es gibt viele Bücher (auch mein Buch enthält einen Abschnitt, der mir inzwischen gar nicht mehr gefällt) und „1000“ Webseiten und mehr. Ein eigenes Buch braucht man für die PowerShell sicher nicht, nach einer kurzen Übersicht über die Bedeutung der zahlreichen Sonderzeichen sollte man sich mit möglichst vielen Beispielen beschäftigen.

Hier ist ein Beispiel, mit dem ich mich eine Weile beschäftigt habe. Ein regulärer Ausdruck soll prüfen, ob eine Zeichenkette mit „Error“ beginnt und dann mittendrin eine IP-Adresse enthält. Zuerst dachte ich, dass es dafür eine Art And-Operator geben muss, der zwei Teilausdrücke (einen für „Error“ und einen für die IP-Adresse) verknüpft bis mir klar wurde, dass reguläre Ausdrücke so (anscheinend) nicht funktionieren. Man muss ein Muster finden, dass als Ganzes angewendet werden kann. Hier ist meine Lösung:

^(Error)[\w\s]+\d{3}\.\d{3}\.\d{1,3}\.\d{2,3}

Auch wenn es zunächst nicht den Anschein haben dürfte, für echte Kenner ist das vermutlich kein ernst zu nehmendes Beispiel, da es trotz der Länge sehr einfach ist:

^(Error) – es muss ein Error am Anfang (^) stehen

[\w\s]+ – mindestens ein, aber beliebig viele Zeichen oder Whitespaces (z.B. Leerzeichen)

\d{3}\. – eine Gruppe von genau drei Ziffern gefolgt von einem Punkt (dem ein Escape-Zeichen vorausgeht, da der Punkt eine eigene Bedeutung hat)

\d{3}\. – dito

\d{1,3}\. eine Gruppe von mind. 1, max. 3 Ziffern. Das ist eine rein willkürliche EInschränkung, um ein wenig Abwechslung in den Ausdruck zu bringen.

\d{2,3}\. -dito, die 4. Zifferngruppe der IP-Adresse darf dann eben nur aus 2-3 Zeichen bestehen. Ein

„Error bei 192.168.1.10“ -match „^(Error)[\w\s]+\d{3}\.\d{3}\.\d{1,3}\.\d{2,3}“

liefert True, was dafür spricht, dass der Ausdruck so falsch nicht sein. Das Problem mit regulären Ausdrücken ist immer, dass man an Anfang keine Ahnung hat, welche Zeichenketten noch alles „matchen“, also ein True liefern.

Dass es mit einer Variante funktioniert bedeutet nicht, dass auch falsche IP-Adressen positiv „matchen“ (sollte das also ein echter Profi lesen würde ich mich über einen Ratschlag freuen).

Das „Problem“ mit diesem Ausdruck ist lediglich, dass man an die IP-Adresse nicht herankommt. Möchte man die IP-Adresse wissen, auf die gematch wurde, würde ich nur auf die IP-Adresse prüfen:

\d{3}\.\d{3}\.\d{1,3}\.\d{2,3}

Jetzt liefert $Matches[0] nur die IP-Adresse.

Schreibe einen Kommentar

Bitte logge dich mit einer dieser Methoden ein, um deinen Kommentar zu veröffentlichen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s