Programmbeispiel: Aktienkurse
(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)
Ein anderes Problem ergab sich, als ich an einem Programm schrieb, das mit Aktienkursen umgehen musste. Ich hatte Kurse wie »9.0500000037272« erhalten. Offensichtlich war 9.05 gemeint, aber wegen der nicht beliebig genauen internen Darstellung von Fließkommazahlen gibt Perl den Wert unter Umständen so aus. Normalerweise hätte ich einfach printf benutzt und nur zwei Nachkommastellen ausgegeben, wie wir das im Beispiel »Temperatur-Umwandlung« gemacht haben (siehe Erweiterte einführende Beispiele: Zu den Beispielen und folgende); doch hier ging das nicht. Zu dieser Zeit wurden die US-Aktienkurse noch in der gemischten Schreibweise mit ganzen Zahlen und Brüchen wie in »12 1/8« angegeben. In so einem Fall will man »12.125« haben und nicht nur zwei Stellen nach dem Dezimalpunkt.
Ich verfiel auf folgende Methode: »Die ersten zwei Nachkommastellen werden immer dargestellt, die dritte nur, wenn sie keine Null ist. Die restlichen Stellen werden abgeschnitten.« Damit bekommt man für 12.3750000000392 oder auch für das bereits schon richtige 12.375 die Zahl »12.375«; dagegen wird 37.500 auf »37.50« reduziert. Genau was ich wollte.
Wie würden wir das implementieren? Die Variable $kurs enthält den zu verarbeitenden String, also versuchen wir es mit:
$kurs =~ s/(\.\d\d[19]?)\d*/$1/
(Zur Erinnerung: ˹\d˼ wurde unter Mustererkennung mit Regulären Ausdrücken: Rekapitulation eingeführt und passt auf eine Ziffer.)
Das ˹\.˼ am Anfang passt auf den Dezimalpunkt, die folgenden ˹\d\d˼ auf die ersten zwei Ziffern nach dem Punkt. Das ˹[1-9]?˼ passt nur, wenn die dritte Stelle keine Null ist. Was bisher erkannt wurde, soll erhalten bleiben, deshalb wird es eingeklammert, so dass es in der Variablen $1 aufgefangen wird. Wir werden dieses $1 im Ersatztext verwenden. Falls der reguläre Ausdruck nur auf gerade das Bisherige passt, wird der ganze erkannte String durch genau denselben ersetzt - nicht sehr interessant. Nun hört aber unser regulärer Ausdruck nicht nach der Klammer auf. Wenn dieser Teil der Regex auch auf Zeichen im String passt, werden diese nicht in $1 abgelegt, kommen damit nicht in den Ersatzteil der Substitution und werden so gelöscht. In unserem Fall sind das alle zusätzlichen Ziffern, die auf das ˹\d*˼ am Ende der Regex passen.
Wir werden unter Wie Regex-Maschinen arbeiten auf dieses Beispiel zurückkommen, wenn wir analysieren, was genau hinter den Kulissen abläuft, wenn ein Muster erkannt wird. Bei Varianten zu diesem Beispiel gibt es einige interessante Punkte zu lernen.
<< zurück | vor >> |
Tipp der data2type-Redaktion: Zum Thema Reguläre Ausdrücke bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: |
Copyright der deutschen Ausgabe © 2008 by O’Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "Reguläre Ausdrücke" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.
O’Reilly Verlag GmbH & Co. KG, Balthasarstr. 81, 50670 Köln