Reguläre Ausdrücke / regular expression =~ m/^[\w\-]+@[\.\w\-]+$/ P. Brezany 2 Mustererkennung und Reguläre Ausdrücke in Perl http://de.wikipedia.org/wiki/Reguläre_Ausdrücke http://en.wikipedia.org/wiki/Regular_expression http://www.google.at/search?q=regex+perl P. Brezany 3 Reguläre Ausdrücke in der theoretischen Informatik Alternative Aneinanderreihung Wiederholung 0 oder 1 0 und 1 1n (n ≥ 0) 0+1 0.1 1* 0|1 01 11* = 1+ Beispiel: Beispiel: (0|1)* (001)+ 110000001…1111001100 001001001001001001001 P. Brezany 4 Reguläre Ausdrücke in der Praxis 84.141.73.125 - - [07/Feb/2006:16:30:48 +0100] "GET /~charlie/burka-girls/burka-girls/zeichnen.gif HTTP/1.1" 200 17401 "http://www.horus.at/~charlie/burka-girls/index.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Crazy Browser 1.0.5; .NET CLR 1.0.3705; .NET CLR 1.1.4322)" 21374 84.58.207.237 - - [07/Feb/2006:18:17:32 +0100] "GET /~charlie/fotos/down.gif HTTP/1.1" 200 79 "http://www.horus.at/~charlie/fotos/index.php" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8" 29228 84.58.207.237 - - [07/Feb/2006:18:17:32 +0100] "GET /~charlie/fotos/private_fotos/archiv/iris_party01.jpg HTTP/1.1" 200 59489 "http://www.horus.at/~charlie/fotos/index.php" "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.8.2 (KHTML, like Gecko) Safari/85.8" 27171 … P. Brezany 5 Perl (Practical Extraction and Report Language) #!/usr/bin/perl print "Hallo Welt! \n"; P. Brezany 6 Mustererkennung und Reguläre Ausdrücke in Perl =~ m/MUSTER/ =~ s/MUSTER/TEXT/ split(MUSTER,STRING) P. Brezany 7 Mustererkennung und Reguläre Ausdrücke in Perl #!/usr/bin/perl $satz = "Hallo Welt! \n"; if ($satz =~ m/Hallo/) { print "Hallo gefunden!"; } P. Brezany 8 Mustererkennung und Reguläre Ausdrücke in Perl #!/usr/bin/perl $satz = "Hallo Welt! \n"; $satz =~ s/Hallo/Tschau/; print $satz; P. Brezany 9 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie!"; $satz =~ m/a/; ⇒ true matcht erstes kleines a im String P. Brezany 10 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie!"; $satz =~ m/\d/; ⇒ true matcht erste Ziffer (3) im String (digit) P. Brezany 11 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3·Engel für Charlie!"; $satz =~ m/\D/; ⇒ true matcht erste Nicht-Ziffer (Leerzeichen nach 3 und vor E) P. Brezany 12 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie!"; $satz =~ m/f[äöü]r/; ⇒ true Zeichen-Klassen: z.B. [01], [äöü], [a-z], [^0-9] matcht: fär oder för oder für im String matcht nicht: füür oder fäöür oder fr oder FÜR P. Brezany 13 Mustererkennung und Reguläre Ausdrücke in Perl Zeichen, wie ^ $ ? . + * | [ ) \ / haben eine spezielle Bedeutung in Muster und müssen, wenn sie als normales Zeichen verwendet werden, mit einem Backslash \ vor dem Zeichen maskiert werden. P. Brezany 14 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "Nur 3 Engel für Charlie?"; $satz =~ m/^\?/; ⇒ false matcht: ein Fragezeichen im String, das am String-Anfang stehen muss P. Brezany 15 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "Nur 3 Engel für Charlie?"; $satz =~ m/\?$/; ⇒ true matcht: ein Fragezeichen im String, das am String-Ende stehen muss P. Brezany 16 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie???"; $satz =~ m/Engeln?/; ⇒ true Das Fragezeichen bedeutet, dass der Buchstabe vor dem Fragezeichen (n) einmal oder keinmal vorkommen darf. P. Brezany 17 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie???"; $satz =~ m/Ch.rlie/; ⇒ true Der Punkt (Joker) kann für genau ein beliebiges Zeichen stehen. matcht: Charlie, ChArlie, Ch1rlie, Ch%rlie, Ch rlie matcht nicht: Chrlie, Chaarlie P. Brezany 18 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie???"; $satz =~ m/Charlie\?+/; ⇒ true matcht: Charlie?, Charlie????,… $satz =~ m/Charlie\?*/; matcht: Charlie auch ohne ? P. Brezany 1 - n Fragezeichen ⇒ true 0 - n Fragezeichen 19 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "3 Engel für Charlie???"; $satz =~ m/Charlie\?{2,4}$/; ⇒ true matcht: Charlie mit 2,3,oder 4 Fragezeichen $satz =~ m/ChArLiE/i; ⇒ true Das i macht das Muster case-insensitive, also unempfindlich gegenüber Groß- oder Kleinschreibung. P. Brezany 20 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "Engel 1, Engel 2 und Engel 3 für Charlie!"; $satz =~ s/Engel/Teufel/; $satz ist "Teufel 1, Engel 2 und Engel 3 für Charlie!"; $satz =~ s/Engel/Teufel/g; $satz ist "Teufel 1, Teufel 2 und Teufel 3 für Charlie!"; P. Brezany 21 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "Teufel 1, Teufel 2 und Teufel 3."; $satz =~ s/(\d)/v$1.1/g; $satz = "Teufel v1.1, Teufel v2.1 und Teufel v3.1."; Mit runden Klammern kann man Teile des Strings abspeichern. Der gematchte Text des Musters im ersten Klammernpaar wird in $1, der im Zweiten in $2 gespeichert usw. P. Brezany 22 Mustererkennung und Reguläre Ausdrücke in Perl $satz = "Engel A"; $satz =~ s/^(.)(.*)(.)$/$3$2$1/; $satz ist "Angel E"; Der Ausdruck vertauscht den ersten und den letzten Buchstaben. ^(.) (.*) (.)$ speichert den ersten Buchstaben speichert die mittleren Buchstaben speichert den letzten Buchstaben P. Brezany in $1 in $2 in $3 23 =~ m/^[\w\-]+@[\.\w\-]+$/ P. Brezany 24 Mustererkennung und Reguläre Ausdrücke in Perl Beispiel: E-Mail Adresse? $email =~ m/^[\w\-]+@[\.\w\-]+$/; Beispiel: Österreichische Postleitzahl? $plz =~ m/A\s*-\s*\d{4}$/; Beispiel: whitespace vorne und hinten entfernen… $name =~ s/^\s*(.*?)\s*$/$1/; P. Brezany 25 \n \t \w \W \d \D \s \S \b \B . ^ $ * *? + +? ? [abc] [^ab] [a-z]+ | () $1 {2,4} \i \g - Zeilenumbruch - Tabulator - Irgendein alphanumerischer (word) Buchstaben; [a-zA-Z0-9_] - nicht alphanumerisch (non-word); ist identisch mit [^a-zA-Z0-9_] - Eine Zahl. Ist identisch mit [0-9] - Keine Zahl. Ist identisch mit [^0-9] - 'whitespace character': space, tab, newline, etc - 'non-whitespace character' - Wortgrenze (nur ausserhalb [ ]) - Innerhalb eines Wortes - Ein einzelner Buchstaben ohne newline - Zeilen- oder Stringanfang (nur außerhalb von [ ]) - Zeilen- oder Stringende - Null oder mehrere Male den letzten Buchstaben (gierig / greedy) - Null oder mehrere Male den letzten Buchstaben (minimal) - Ein oder mehrere Male den letzten Buchstaben (gierig / greedy) - Ein oder mehrere Male den letzten Buchstaben (minimal) - Null oder ein Mal den letzten Buchstaben - a oder b oder c - weder a noch b - Irgendeine Folge von Kleinbuchstaben - entweder oder; z.B.: (eg|le)gs Entweder eggs oder legs - Teil des Strings merken - Quantifier - ignore case (nach Muster) - greedy (nach Muster) P. Brezany 26 Mustererkennung und Reguläre Ausdrücke in Perl Aufgabe 1: $bilder = "1.jpg, 2.jpeg, 3.JPEG, 4.JPG"; Bringen Sie die Endungen der Dateien in ein einheitliches Format. (Textersetzung mit =~ s/MUSTER/TEXT/) P. Brezany 27 Mustererkennung und Reguläre Ausdrücke in Perl Aufgabe 2: if ( $email =~ m/(:|;)-\)/ ) { print "Smile!"; } Welches Muster wird hier erkannt? Wann wird Smile! ausgegeben? P. Brezany 28 Mustererkennung und Reguläre Ausdrücke in Perl Aufgabe 3: Erkennen Sie das grundsätzliche Format eines UNET-Logins. (also: a und Matrikelnummer z.B.: a0409142). Folgende Regeln gilt es einzuhalten: Ein UNET-Login beginnt mit einem a. Danach folgen 7 (beliebigen) Ziffern. P. Brezany 29 Mustererkennung und Reguläre Ausdrücke in Perl Aufgabe 4: Prüfen Sie ob der Name einer skalaren Variable in Perl korrekt ist. (z.B.: $var, $Nachname, $x_11) Folgende Regeln gilt es einzuhalten: Skalar-Variablen beginnen mit einem $-Zeichen. Variablen-Namen bestehen aus (englischen) Buchstaben, Zahlen und Unterstrichen. Nach dem $ muss ein Buchstabe stehen. P. Brezany 30 Mustererkennung und Reguläre Ausdrücke in Perl Aufgabe 5: $var = "Hände, Strände, Bände"; Ersetzen Sie ä durch ae. P. Brezany 31 Mustererkennung und Reguläre Ausdrücke in Perl Aufgabe 6: $email =~ m/^[\w\-]+@[\.\w\-]+$/; Dieser Ausdruck zum matchen von E-Mail Adressen ist nicht perfekt. Suchen Sie Beispiele für a) gültige / vernüftige / realistische E-Mail Adressen, die nicht gematcht werden. b) unsinnige / unrealistische E-Mail Adressen, die gematcht werden. P. Brezany 32 GREP Program (Unix/Linux Utility) P. Brezany 33 Mustererkennung und Reguläre Ausdrücke mit grep grep ist ein Unix-Programm das nach Muster in Dateien sucht Zeilen die das Muster enthalten werden ausgegeben P. Brezany 34 My dog's got no nose. How does he smell? Awful. Mustererkennung und Reguläre Ausdrücke mit grep Optionen: grep -v grep -n grep -i grep -l grep -c grep -A 3 grep -E alle Zeilen die nicht das Muster enthalten mit Zeilennummer vor der Zeile ignoriert Groß/Kleinschreibung gibt (nur) den Dateinamen aus gibt (nur) die Anzahl der Zeilen gibt nach der Zeile noch 3 weitere Zeilen aus oder egrep: erweiterte regex grep -niA 1 SMELL joke1 2:How does he smell? 3-Awful. P. Brezany man grep 35 My dog's got no nose. How does he smell? Awful. Mustererkennung und Reguläre Ausdrücke mit grep [A-Z] [a-z] [0-9] sind Zeichenklassen: grep '[Oo]' joke1 My dog's got no nose. How does he smell? P. Brezany 36 My dog's got no nose. How does he smell? Awful. Mustererkennung und Reguläre Ausdrücke mit grep grep 'l\{2\}' joke1 How does he smell? Der Ausdruck vor \{n\} kommt n Mal vor \{n,\} kommt mindestens n Mal vor \{n,m\} kommt n bis m Mal vor P. Brezany 37 Mustererkennung und Reguläre Ausdrücke mit grep ^Zeilenanfang und Zeilenende$ grep '^$' joke1 findet alle Leerzeilen übrigens: ^ ist der Zirkumflex oder das Caret P. Brezany 38 Mustererkennung und Reguläre Ausdrücke mit grep . * \ - irgendein beliebiges Zeichen - null oder mehrere Male den letzten Ausdruck - zum maskieren von 'Sonderzeichen' P. Brezany 39 Mustererkennung und Reguläre Ausdrücke mit egrep grep -E oder egrep: erweiterte Reguläre Ausdrücke + ? | () - ein oder mehrere Male den letzten Ausdruck - null oder ein Mal den letzten Ausdruck - entweder oder - z.B.: (eg|le)gs : Entweder eggs oder legs P. Brezany 40 - P. Brezany 41