Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions...

27
Programmierkurs für absolute Anfänger http://www.coli.uni-saarland.de/~cabr/ teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester 2005

Transcript of Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions...

Page 1: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger

http://www.coli.uni-saarland.de/~cabr/teaching.php

Reguläre Ausdrücke / regular expressions

Caren BrinckmannSommersemester 2005

Page 2: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 2

Wozu braucht man das? (1)

Page 3: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 3

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!";

}

Page 4: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 4

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!";

}

Page 5: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 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, ...

Page 6: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 6

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 / Alabama liegt in Amerika./haben/ Wir haben keinen Zucker mehr. Haben Sie

welchen? Leerzeichen und Groß-/Kleinschreibung beachten!

Page 7: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 7

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";

}

Page 8: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 8

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\

Page 9: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 9

Sonderzeichen: Wildcard . Der Punkt . steht für genau ein 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:

a) pit b) pt

spot Pot

spate peat

slap two part

respite

Page 10: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 10

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

Page 11: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 11

Sonderzeichen: Beispiel (1)

while ($zeile = <STDIN>) {if ($zeile =~ /^Wir/) {

print $zeile;}

}

Wir wollen Eis essen.

Das hat keine Wirkung.

Wirkungsgrad ist Null.

druck1.pl text1.txt

Aufruf: perl –w druck1.pl < text1.txt

Ausgabe?

Page 12: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 12

Sonderzeichen: Beispiel (2)

while ($zeile = <STDIN>) {if ($zeile =~ /ung\.$/) {

print $zeile;}

}

Die Bedienung kommt.

Das hat keine Wirkung.

Keine Ahnung!

druck2.pl text2.txt

Aufruf: perl –w druck2.pl < text2.txt

Ausgabe?

Page 13: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 13

Sonderzeichen: Wiederholungen ? + * ? bedeutet, dass das vorhergehende Zeichen keinmal oder

einmal vorkommen kann (also: höchstens einmal)/hal?o/ matcht hao halo zhaloxxx

/hal?o/ matcht nicht hallo

+ bedeutet, dass das vorhergehende Zeichen einmal oder mehrmals vorkommen kann (also: mindestens einmal)/hal+o/ matcht halo hallo halllo zhalllllloxxx

/hal+o/ matcht nicht hao

* bedeutet, dass das vorhergehende Zeichen keinmal oder beliebig häufig vorkommen kann/hal*o/ matcht hao halo hallo zhalllllloxxx

Page 14: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 14

Sonderzeichen: Beispiel (3)

while ($zeile = <STDIN>) {if ($zeile =~ /Al+e/) {

print $zeile;}

}

Alle trinken Bier.

Briten trinken Ale.

Alte Hasen!

druck3.pl text3.txt

Aufruf: perl –w druck3.pl < text3.txt

Ausgabe?

Page 15: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 15

Sonderzeichen: Beispiel (4)

while ($zeile = <STDIN>) {if ($zeile =~ /Al*t?e/) {

print $zeile;}

}

Alle trinken Bier.

Briten trinken Ale.

Alte Hasen!

Frau Aterer kommt.

druck4.pl text4.txt

Aufruf: perl –w druck4.pl < text4.txt

Ausgabe?

Page 16: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 16

Sonderzeichen: Beispiel (5)

while ($zeile = <STDIN>) {if ($zeile =~ /.+/) {

print $zeile;}

}

Alle trinken Bier.

Briten trinken Ale.

Alte Hasen!

druck5.pl text5.txt

Aufruf: perl –w druck5.pl < text5.txt

Ausgabe?

Page 17: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 17

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 hallo halllllox/hal{2,}o/ matcht nicht hao halo

/hal{2,3}o/ matcht hallo halllox/hal{2,3}o/ matcht nicht halo hallllox

Page 18: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 18

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}

Page 19: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 19

Übung1) abc 2) ac 3) 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*/

Page 20: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 20

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

Page 21: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 21

Übung Welche der folgenden Zeichenketten wird von /a(ab)*a/ gematcht?

1) abababa

2) aaba

3) aabbaa

4) aba

5) aabababa

Page 22: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 22

Alternative Zeichenketten: | Mit dem Pipe-Zeichen | kann man mehrere alternative

Zeichenketten angeben.

/(Herr|Frau) Mayer/ matcht Herr Mayer, Frau Mayer

/A(nn|ll)e/ matcht Anne, Alle

/Hund|Katze|Maus/ matcht Hund, Katzen, Mausi

if ($wort =~ /^(be|ent|er|ge|miss|ver|zer)/) {print "$wort beginnt mit einem Präfix!";

}

Page 23: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 23

Zeichenmenge: [ ] Eine Menge von Zeichen in eckigen Klammern bedeutet,

dass genau eins dieser Zeichen gesucht wird (egal welches).

/mar[ckl]o/ matcht marco, marko, marlomatcht nicht marcko, marmo

/M[ae][iy]er/ matcht Maier, Mayer, Meier, Meyer

/a[ln]{2}e/ matcht alle, anne, alne, anle

Page 24: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 24

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 einemGroßbuchstaben gefolgt von

mindestens einem Kleinbuchstaben

/[0-9]{5}/ matcht alle fünfstelligen Dezimalzahlen(auch mit führenden Nullen)

Page 25: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 25

Übung Welche der folgenden Zeichenketten wird von

/^[A-Za-z ]+[\.\?!]$/ gematcht?

1) Lauf!

2) Der Gärtner mäht den Rasen.

3) Wie lange warst Du in Rotenburg/Wuemme?

4) Lisa sucht den Ball.

5) Hast Du schon abgewaschen?

6) Ich glaube ich spinne!?

Page 26: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 26

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, maramatcht nicht ama, ana, ala

/^[^a-z]a/ matcht Mama, Larifarimatcht nicht mama, alari, aMama

Page 27: Programmierkurs für absolute Anfänger cabr/teaching.php Reguläre Ausdrücke / regular expressions Caren Brinckmann Sommersemester.

Programmierkurs für absolute Anfänger – Sitzung 5 27

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