270 likes | 400 Views
Programmierkurs für absolute Anfänger. Reguläre Ausdrücke / regular expressions. http://www.coli.uni-saarland.de/~cabr/teaching.php. Caren Brinckmann Sommersemester 2005. Wozu braucht man das? (1). Wozu braucht man das? (2).
E N D
Programmierkurs für absolute Anfänger Reguläre Ausdrücke / regular expressions http://www.coli.uni-saarland.de/~cabr/teaching.php Caren Brinckmann Sommersemester 2005
Wozu braucht man das? (1) Programmierkurs für absolute Anfänger – Sitzung 5
Wozu braucht man das? (2) if (($laut eq "p") || ($laut eq "t") || ($laut eq "k") || ($laut eq "b") || ($laut eq "d") || ($laut eq "g")) { print "$laut ist ein Plosiv!"; } kürzer: if ($laut =~ /^[ptkbdg]$/) { print "$laut ist ein Plosiv!"; } Programmierkurs für absolute Anfänger – Sitzung 5
Was sind reguläre Ausdrücke? (1) • Reguläre Ausdrücke (RA) sind genau definierte Suchmuster für Zeichenfolgen (d.h. einzelne Zeichen und Zeichenketten). • Mit RA kann man nach Zeichenfolgen suchen, die dem jeweiligen Suchmuster entsprechen, und sie weiterverarbeiten (ersetzen, umformatieren, konkatenieren, ...). • Außerdem kann man Bedingungen in Programmen an reguläre Ausdrücke knüpfen. if ($laut =~ /^[ptkbdg]$/) { print "$laut ist ein Plosiv!"; } Programmierkurs für absolute Anfänger – Sitzung 5
Was sind reguläre Ausdrücke? (2) • Ein RA ist also eine Beschreibung, die auf eine ganze Menge von Zeichenfolgen passt. • Was bedeutet das konkret? Am besten lernen durch viele Beispiele! • Wo werden RA in der Praxis eingesetzt? • UNIX-Kommandozeilentools: grep, sed, awk, ... • Texteditoren: XEmacs, TextPad, ... • Programmiersprachen: Perl, Python, Java, ... • Shells (eingeschränkt): bash, Windows-Konsole, ... Programmierkurs für absolute Anfänger – Sitzung 5
Einfache RA in Perl • Ein RA wird in Perl zwischen zwei Schrägstriche eingeschlossen: /a/ • Wenn ein RA auf eine Zeichenfolge passt, so sagt man auch „der reguläre Ausdruck matcht die Zeichenfolge“.Bsp: /a/ matcht die Zeichenfolge "a" aber auch das 'a' in "Hallo". • Zeichen- und Zeichenkettenliterale: /a/ Alabama liegt in Amerika. /a / Alabamaliegt in Amerika. /haben/ Wir haben keinen Zucker mehr. Haben Sie welchen? • Leerzeichen und Groß-/Kleinschreibung beachten! Programmierkurs für absolute Anfänger – Sitzung 5
Matching Operator =~ • Um einen regulären Ausdruck mit einer Zeichenkette zu vergleichen, benötigt man den sogenannten Matching Operator: =~ $wort = "Hans"; if ($wort =~ /an/) { print "match!\n"; } else { print "kein match!\n"; } Programmierkurs für absolute Anfänger – Sitzung 5
Sonderzeichen • Ein RA besteht aus Literalen (also: wörtlich zu interpretierenden Zeichen und Zeichenketten), und aus folgenden Sonderzeichen, die eine spezielle Bedeutung haben: \ . ^ $ + ? * { } ( ) [ ] | • D.h., wenn eins dieser Sonderzeichen wörtlich gesucht werden soll, so muss es mit einem vorangestellten \ (backslash) "entwertet" werden, z.B./2\$/ matcht Das kostet 2$./2$/ matcht nicht Das kostet 2$. • Übung: [2]ja?2.3(oder?)\abc\ Programmierkurs für absolute Anfänger – Sitzung 5
Sonderzeichen: Wildcard . • Der Punkt . steht für genauein beliebiges Zeichen (Ausnahme: Zeilentrennzeichen \n). • /a./ Maria mag Anna • Übung: /mar.o/ matcht welche Teile? marco, amarzo, marsio, Mario, amar ono, schmargo, ammarkoni, marrko • Übung: Konstruiere einen regulären Ausdruck, der auf alle Zeichenketten unter a) passt (also Zeichenkettenteile matcht), aber keine der Zeichenketten unter b) akzeptiert: • pit b) pt spotPot spate peat slap two part respite Programmierkurs für absolute Anfänger – Sitzung 5
Sonderzeichen: Positionsmarker ^ und $ • Das Caret-Zeichen ^ steht für den Anfang einer Zeichenkette. • Das Dollar-Zeichen $ steht für das Ende einer Zeichenkette. /^Henning/ matcht Henning Meier /^Henning/ matcht nicht Meier Henning /Henning$/ matcht nicht Henning Meier /Henning$/ matcht Meier Henning Programmierkurs für absolute Anfänger – Sitzung 5
while ($zeile = <STDIN>) { if ($zeile =~ /^Wir/) { print $zeile; } } Wir wollen Eis essen. Das hat keine Wirkung. Wirkungsgrad ist Null. Sonderzeichen: Beispiel (1) druck1.pl text1.txt Aufruf: perl –w druck1.pl < text1.txt Ausgabe? Programmierkurs für absolute Anfänger – Sitzung 5
while ($zeile = <STDIN>) { if ($zeile =~ /ung\.$/) { print $zeile; } } Die Bedienung kommt. Das hat keine Wirkung. Keine Ahnung! Sonderzeichen: Beispiel (2) druck2.pl text2.txt Aufruf: perl –w druck2.pl < text2.txt Ausgabe? Programmierkurs für absolute Anfänger – Sitzung 5
Sonderzeichen: Wiederholungen ? + * • ? bedeutet, dass das vorhergehende Zeichen keinmal oder einmal vorkommen kann (also: höchstens einmal) /hal?o/ matcht haohalo zhaloxxx /hal?o/ matcht nicht hallo • + bedeutet, dass das vorhergehende Zeichen einmal oder mehrmals vorkommen kann (also: mindestens einmal) /hal+o/ matcht halohallohalllo zhalllllloxxx /hal+o/ matcht nicht hao • * bedeutet, dass das vorhergehende Zeichen keinmal oder beliebig häufig vorkommen kann /hal*o/ matcht haohalohallozhalllllloxxx Programmierkurs für absolute Anfänger – Sitzung 5
while ($zeile = <STDIN>) { if ($zeile =~ /Al+e/) { print $zeile; } } Alle trinken Bier. Briten trinken Ale. Alte Hasen! Sonderzeichen: Beispiel (3) druck3.pl text3.txt Aufruf: perl –w druck3.pl < text3.txt Ausgabe? Programmierkurs für absolute Anfänger – Sitzung 5
while ($zeile = <STDIN>) { if ($zeile =~ /Al*t?e/) { print $zeile; } } Alle trinken Bier. Briten trinken Ale. Alte Hasen! Frau Aterer kommt. Sonderzeichen: Beispiel (4) druck4.pl text4.txt Aufruf: perl –w druck4.pl < text4.txt Ausgabe? Programmierkurs für absolute Anfänger – Sitzung 5
while ($zeile = <STDIN>) { if ($zeile =~ /.+/) { print $zeile; } } Alle trinken Bier. Briten trinken Ale. Alte Hasen! Sonderzeichen: Beispiel (5) druck5.pl text5.txt Aufruf: perl –w druck5.pl < text5.txt Ausgabe? Programmierkurs für absolute Anfänger – Sitzung 5
Sonderzeichen: Wiederholungen { } • Die geschweiften Klammern { } werden benutzt, um • eine exakte Anzahl{n} • eine Mindestanzahl {n,} • eine Mindest- und eine Höchstanzahl {n,m} von Zeichenwiederholungen zu suchen. • /hal{2}o/ matcht xhalloy/hal{2}o/ matcht nicht xhallloy halo • /hal{2,}o/ matcht hallohalllllox/hal{2,}o/ matcht nicht hao halo • /hal{2,3}o/ matcht hallohalllox/hal{2,3}o/ matcht nicht halo hallllox Programmierkurs für absolute Anfänger – Sitzung 5
Zusammenfassung Sonderzeichen: Wiederholungen *keinmal oder beliebig oft +mindestens einmal ? höchstens einmal {n}genau n-mal {n,} mindestens n-mal {n,m}mindestens n-mal, aber maximal m-mal Äquivalenzen: • * ist äquivalent zu {0,} • + ist äquivalent zu {1,} • ? ist äquivalent zu {0,1} Programmierkurs für absolute Anfänger – Sitzung 5
Übung 1)abc2)ac3)abbb 4)bbc 5) aabcd 6) b Welche Zeichenketten(teile) werden jeweils gematcht? • /ab+c?/ • /a?b*c/ • /b+c*/ • /^b+c*$/ • /a.+b?c/ • /b{2,}c?/ • /^a{1,2}b+.?d*/ Programmierkurs für absolute Anfänger – Sitzung 5
Gruppierung: ( ) • Mehrere Zeichen können mit runden Klammern gruppiert werden. • Dadurch ist es möglich, die Wiederholungssonderzeichen nicht nur auf einzelne Zeichen, sondern auch auf Zeichenketten und eingebettete RA anzuwenden. /(ro)+/ matcht robo, rororo, brorok /h(al)*lo/ matcht hlo, hhalallo, halloi /ha(ll)?o/ matcht hao, hallo,ahaoi /(h?a)+lo/ matcht haahalo, aaalo, hahahalo, alo, halo Programmierkurs für absolute Anfänger – Sitzung 5
Übung • Welche der folgenden Zeichenketten wird von /a(ab)*a/ gematcht? 1) abababa 2) aaba 3) aabbaa 4) aba 5) aabababa Programmierkurs für absolute Anfänger – Sitzung 5
Alternative Zeichenketten: | • Mit dem Pipe-Zeichen | kann man mehrere alternative Zeichenketten angeben. /(Herr|Frau) Mayer/ matcht Herr Mayer, Frau Mayer /A(nn|ll)e/ matchtAnne, Alle /Hund|Katze|Maus/ matchtHund,Katzen,Mausi if ($wort =~ /^(be|ent|er|ge|miss|ver|zer)/) { print "$wort beginnt mit einem Präfix!"; } Programmierkurs für absolute Anfänger – Sitzung 5
Zeichenmenge: [ ] • Eine Menge von Zeichen in eckigen Klammern bedeutet, dass genau eins dieser Zeichen gesucht wird (egal welches). /mar[ckl]o/ matcht marco,marko,marlo matcht nicht marcko, marmo /M[ae][iy]er/ matcht Maier,Mayer,Meier,Meyer /a[ln]{2}e/ matcht alle,anne,alne,anle Programmierkurs für absolute Anfänger – Sitzung 5
Zeichenbereich: [ - ] • Wenn genau ein Zeichen aus einem Zeichenbereich oder eine Ziffer aus einem Ziffernbereich gesucht wird, so verwendet man den Bindestrich in eckigen Klammern. /a[k-n]a/ matcht aka,ala,ama,ana /[A-Z][a-z]+/ matcht alle Zeichenketten mit einem Großbuchstaben gefolgt von mindestens einem Kleinbuchstaben /[0-9]{5}/ matcht alle fünfstelligen Dezimalzahlen (auch mit führenden Nullen) Programmierkurs für absolute Anfänger – Sitzung 5
Übung • Welche der folgenden Zeichenketten wird von /^[A-Za-z ]+[\.\?!]$/ gematcht? • Lauf! • Der Gärtner mäht den Rasen. • Wie lange warst Du in Rotenburg/Wuemme? • Lisa sucht den Ball. • Hast Du schon abgewaschen? • Ich glaube ich spinne!? Programmierkurs für absolute Anfänger – Sitzung 5
Negation einer Zeichenauswahl:[^ ] • Wenn am Anfang einer Zeichenmenge oder eines Zeichenbereichs das Caret-Zeichen ^ steht, so wird jedes Zeichen gematcht, das nicht zu der Menge bzw. dem Bereich gehört. • Das Caret-Zeichen hat also zwei Bedeutungen! /a[^mnl]a/ matcht aga, a a, a9a, mara matcht nicht ama, ana, ala /^[^a-z]a/ matcht Mama, Larifari matcht nicht mama, alari, aMama Programmierkurs für absolute Anfänger – Sitzung 5
Nachlesen und Ausprobieren! • http://www.tekromancer.com/perl2/7.html • http://gnosis.cx/publish/programming/regular_expressions.html • http://www.itri.brighton.ac.uk/ARCHIVE/courses/MScLex/exercises/regex/ • http://www.regular-expressions.info/quickstart.html • http://www.ifi.unizh.ch/cl/siclemat/lehre/ss01/pcl2/regextut Programmierkurs für absolute Anfänger – Sitzung 5