Mustererkennung mit regulären Ausdrücken
(Auszug aus "Reguläre Ausdrücke" von Jeffrey E. F. Friedl)
In Perl werden reguläre Ausdrücke auf mannigfache Weise benutzt. Im einfachsten Fall wird getestet, ob der Text in einer bestimmten Variablen auf einen regulären Ausdruck passt. Das folgende Programmstück prüft den String in der Variablen $eingabe und gibt aus, ob darin nur Ziffern vorkommen:
if ($eingabe =~ m/^[09]+$/) {
print "nur Ziffern\n";
} else {
print "nicht nur Ziffern\n";
}
Die erste Zeile sieht zunächst merkwürdig aus. Der reguläre Ausdruck ist ˹^[09]+$˼, und das umgebende m/.../ sagt Perl, was damit zu tun ist. Das m (für »Matching«) ist der Mustersuch-Operator; die Slashes begrenzen den regulären Ausdruck. (Anmerkung: Das m kann in den meisten Fällen weggelassen werden, und viele Perl-Programmierer lassen es immer weg: $eingabe =~ /^[09]+$/. Mir persönlich gefällt das m für »Match«, deshalb verwende ich es meist.) Das =~ verknüpft die Regex mit dem zu prüfenden Text, in diesem Fall mit dem Inhalt der Variablen $eingabe.
Verwechseln Sie nicht =~ mit = oder ==, das sind ganz unterschiedliche Dinge. Der Operator == vergleicht zwei Zahlen (für String-Vergleiche muss eq benutzt werden, wie wir bald sehen werden). Der Operator = wird benutzt, um einer Variablen einen Wert zuzuweisen, hier $celsius = 20. Dagegen verknüpft =~ einen regulären Ausdruck mit dem String, der abgesucht werden soll (in diesem Fall ist m/^[09]+$/ das Suchmuster, das auf $eingabe angewendet wird). Bei anderen Programmiersprachen ist dies anders gelöst, Sie werden dazu unter Features und Dialekte Beispiele finden.
Man kann den Operator als »passt auf« lesen.
if ($eingabe =~ m/^[09]+$/)
heißt dann:
falls der Text in der Variablen $eingabe auf ˹^[09]+$˼ passt, dann ...
Das Resultat von $eingabe =~ m/^[09]+$/ ist wahr, wenn ˹^[09]+$˼ im String $eingabe gefunden wird, sonst ist es falsch. Die if-Anweisung testet diesen Wahrheitswert und entscheidet, welche Nachricht ausgegeben werden soll.
Ein Test auf $eingabe =~ m/[09]+/ (wie vorhin, aber ohne die einfassenden Zirkumflex und Dollar-Zeichen) wäre wahr, wenn $eingabe an irgendeiner Stelle mindestens eine Ziffer enthielte. Das ˹^...$˼ stellt sicher, dass $eingabe nur Ziffern enthält.
Jetzt kombinieren wir die letzten zwei Beispiele. Wir fragen den Benutzer nach einer Zahl, lesen diesen Wert ein und überprüfen mit einem regulären Ausdruck, ob es sich nur um Ziffern handelt. Wenn dem so ist, berechnen wir zur eingegebenen Celsius-Zahl die Temperatur in Fahrenheit; sonst geben wir eine Fehlermeldung aus.
print "Geben Sie eine Temperatur in Celsius ein: ";
$celsius = <STDIN>; # liest eine Eingabe-Zeile
chomp($celsius); # entfernt das Newline von $celsius
if ($celsius =~ m/^[09]+$/) {
$fahrenheit = ($celsius * 9 / 5) + 32; # Fahrenheit berechnen
print "$celsius C entspricht $fahrenheit F.\n";
} else {
print "Zahl erwartet, nicht \"$celsius\".\n";
}
In der letzten print-Anweisung mussten die zwei Anführungszeichen um $celsius mit einem Backslash geschützt werden. Bei allen Programmiersprachen tritt das Problem auf, dass die Zeichen, die einen literalen String einschließen, auch im String selbst vorkommen können. In Perl gibt es dabei zwischen Strings und regulären Ausdrücken kaum Unterschiede. Der Mechanismus ist der gleiche: Man setzt einen Backslash davor. In anderen Sprachen wie Java und Python ist es sehr wichtig, die zwei Fälle zu unterscheiden. Im Abschnitt Massenhaft Metazeichen wird das genauer beschrieben. (In VB.NET muss man ›""‹ statt ›\"‹ schreiben, damit man innerhalb eines Strings in Anführungszeichen ein Anführungszeichen erhält.)
Wenn wir dieses Programm in eine Datei c2f schreiben, können wir es ausführen:
% perl -w c2f
Geben Sie eine Temperatur in Celsius ein: 22
22 C entspricht 71.599999999999994316 F.
Hoppla. Der simple print-Operator in Perl ist offenbar für Fließkommazahlen nicht sehr geeignet. Ich will darauf nicht näher eingehen und sage nur, dass es mit printf (»print formatted«) besser geht:
printf "%.2f C entspricht %.2f F.\n", $celsius, $fahrenheit;
Dabei ändern sich nicht die Werte der Variablen, sondern nur die Art, wie diese Werte ausgegeben werden:
Geben Sie eine Temperatur in Celsius ein: 22
22.00 C entspricht 71.60 F.
- Mehr Praxisnähe
- Nebeneffekte bei erfolgreicher Mustererkennung
- Verschachtelte reguläre Ausdrücke
- Rekapitulation
<< zurück | vor >> |
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
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