Benutzer-Werkzeuge

Webseiten-Werkzeuge


Beispiele

Am Ende der Beschreibung der regulären Ausdrücke sollen nun ein paar weitere Beispiele gezeigt werden, die die Leistungsfähigkeit dieser Mustererkennung belegen sollen. Gleichzeitig lassen sich daraus auch Lösungen für ähnliche Probleme aus der täglichen Praxis ableiten.

Regulärer Ausdruck

([01]?#|2[0-3]):([0-5]#)

  • Der Ausdruck erkennt eine Uhrzeit. Natürlich würde dies auch der Ausdruck '##:##' erledigen, allerdings erkennt dieser auch unsinnige Zeiten wie '25:63'. Der Teilausdruck für die Stunden (erste Klammer) besteht aus zwei Alternativen. Der Ausdruck '[01]?#' erkennt alle Stunden zwischen '00' und '19', mit oder ohne führende Null. Die Alternative '2[0-3]' deckt die fehlenden vier Stunden ab.
  • Der Teilausdruck für die Minuten ist sehr viel einfacher. Durch den ersten Teil '[0-5]' wird die erste Minutenziffer entsprechend eingeschränkt und es wird eine führende Null erzwungen. Die zweite Minutenziffer kann dann von '0' bis '9' alles sein.

Regulärer Ausdruck

(#{1,3}(\.###)*|#+)(,##)? ?€

  • Der Ausdruck erkennt einen Geldbetrag, dessen Vorkommastellen eine Tausendertrennung haben. Der Ausdruck startet mit ein bis drei Ziffern, vor dem ersten Trennzeichen, hier ein Punkt, oder vor dem Komma, der Leerstelle oder dem Euro. Folgt ein Punkt als Tausendertrennzeichen, müssen dem Punkt noch genau drei Ziffern folgen. Von dieser Gruppe aus Trennzeichen und drei Ziffern kann es beliebig viele (also auch keine) geben, was mit dem Quantor '*' unmittelbar hinter der schliessenden Klammer angezeigt wird.
  • Die Nachkommastellen sind optional. Der Quantor '?' erlaubt, wenn überhaupt vorhanden, nur eine Wiederholung. Das Währungszeichen kann noch durch eine vorangehende Leerstelle abgetrennt sein.
  • Der Ausdruck erkennt Zeichenketten wie '1€', '1,00 €', '123,45€', '1.234,56€' oder '1.234.567,89 €'. Dabei ist im ersten Textpuffer immer der erkannte Gesamtbetrag in Euro zu finden, und im Textpuffer drei stehen die Centbeträge.

Regulärer Ausdruck

([-+]?[0-9]+(\.[0-9]*)?[CF])

  • Der Ausruck erkennt eine Temperaturangabe. Mit dem Teilausdruck '[-+]?' wird ein eventuell vorhandenes Vorzeichen erkannt. Der nachfolgende Ausdruck '[0-9]+' verlangt eine zumindest einstellige Dezimalzahl als ganzzahlige Temperaturangabe. Die eventuell vorhandenen Nachkommastellen werden mit '(\.[0-9]*)?' erkannt. Das Fragezeichen ist dafür verantwortlich, daß die Nachkommastellen optional sind. Der Stern sorgt dafür, daß auch Temperaturangaben wie '4.' gültig sind. Zu guter Letzt wird noch ein nachfolgendes 'C' oder 'F' gefordert, je nachdem ob es sich um eine Angabe in Celsius oder Fahrenheit handelt.
  • Der Ausdruck erkennt Zeichenketten wie '4C', '4.123F', '+3C', '-23.5C' oder '+73,42F'. Aber auch Unsinniges wie '-280C'.

Regulärer Ausdruck

(.*[\. ])(#+[- @#]*)|(.*)

  • Der Ausdruck zerlegt Straßenangaben in Straßenname und Hausnummer. Die große Problematik dabei ist, die Grenze von Straßennamen und Hausnummer, so überhaupt vorhanden, zu finden. Betrachten wir zuerst die Hausnummer.
  • Die Hausnummer, die mit dem Teilausdruck '(#+[- @#]*)' erkannt und in einem Zwischenspeicher bereitgestellt werden soll, ist etwas, was immer mit einer Ziffer beginnt. Mit der hier gezeigten, zugegeben etwas laxen Formulierung werden als Hausnummer Zeichenketten wie '5', '5a', '17 C', '3-5' oder '123a-d' erkannt, aber auch Unsinniges wie '3ab' oder '3–'. Eine ganz wesentliche Eigenschaft des Teilausdrucks für die Hausnummer ist der, daß er sich bereits mit einer einzigen Ziffer zufrieden gibt.
  • Das ist der Grund, warum der Straßennamen nicht einfach mit '(.*)' aufgesammelt werden kann. Durch die Gier des '.*' wird zunächst der gesamte Text abgespeichert. Die folgende Hausnummer erzwingt dann die Herausgabe einzelner Zeichen am Ende des Textes. Da der Teilausdruck für die Hausnummer aber bereits mit einer Ziffer zufrieden ist, wird der Ausdruck '.*' bei einer mehrstelligen Hausnummer immer nur die letzte Ziffer abgeben. Das ist so nicht gewollt.
  • Wir brauchen daher noch einen Teilausdruck, der den Anfang der Hausnummer findet. Dies ist das '[\. ]' beim Straßennamen. Dies fordert eine Leerstelle oder einen Punkt vor der Hausnummer.
  • Als letztes Problem müssen wir noch den Fall berücksichtigen, daß überhaupt keine Hausnummer angegeben ist. Dies wird mit dem alternativen Ausdruck '(.*)()' realisiert.
  • Allerdings hat auch dieser Ausdruck noch eine Lücke, nämlich wenn die Hausnummer mit dem Straßennamen zusammen geschrieben wurde, wie zum Beispiel in 'Gartenstrasse44'. In diesem Fall wird der komplette Text als Straßenname erkannt, weil der zweite Teilausdruck der Alternative greift.

Regulärer Ausdruck

((25[0-5]|2[0-4]#|[01]?##|#)(\.(25[0-5]|2[0-4]#|[01]?##|#)){3})

  • Der Ausdruck erkennt eine IP-Adresse. Der Ausdruck wirkt etwas komplex, weil er den Gültigkeitsbereich der einzelnen Adressteile prüft. Der erste Teil der Alternative deckt die Zahlen im Bereich 250 bis 255 ab, die zweite Alternative die im Bereich 200 - 249, die dritte Alternative die im Bereich 000 - 199. Die letzte Alternative schliesslich ist für die einstelligen Zahlen.
  • Dieser ersten Adressangabe im Bereich '0' bis '255' folgen jetzt noch genau drei weitere gleichartige Adressangaben, die durch einen Punkt abgetrennt werden.
  • Der Ausdruck erkennt Adressen wie '0.0.0.0', '010.001.001.001', '192.168.1.1' aber auch '127.00.000.1'. Im ersten Textpuffer befindet sich die gesamte Adresse.

Regulärer Ausdruck

*(@.{0,28}[^ ]).*

  • Der Ausdruck erkennt einen bis zu 30 Zeichen langen Namen, der mit einem Buchstaben beginnen muß. Der resultierende Textpuffer soll eventuell dem Namen folgende Leerzeichen nicht enthalten, weil zum Beispiel innerhalb einer Schablone ein Vorname und ein Nachname zusammengesetzt werden sollen.
  • Der Teilausdruck '[^ ]' verlangt ein Zeichen, das keine Leerstelle ist. Da diese Forderung unmittelbar auf einen gierigen Quantor folgt (auch '{0,28}' ist trotz Obergrenze gierig!), muß der Teilausdruck '.{0,28}' solange Zeichen wieder abgeben, bis kein Leerzeichen mehr abgeben wird. Das letzte abgegebene Zeichen ist noch Bestandteil des Textpuffers.
  • Der Teilausdruck '.*' am Ende wird unbedingt benötigt, weil er es ist, der die vielen abgegebenen, 'wegzuwerfenden' Leerstellen am Schluß wieder akzeptieren muß. Strenggenommen würde ein ' *' die Sachlage sogar besser beschreiben.
  • Der Ausdruck erkennt Zeichenketten wie 'Peter ' oder 'Hans Peter ' und liefert entsprechend 'Peter' oder 'Hans Peter'.
print2forms/regex/weitere_beispiele.txt · Zuletzt geändert: 2018-02-21 14:09 (Externe Bearbeitung)

Seiten-Werkzeuge