Title: Programmierkurs f
1Programmierkurs für absolute Anfänger
? Reguläre Ausdrücke / regular expressions
Caren Brinckmann Sommersemester 2005
- http//www.coli.uni-saarland.de/cabr/teaching.php
2Wozu braucht man das? (1)
3Wozu 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!"
4Was 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!"
5Was 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,
...
6Einfache 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!
7Matching 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"
8Sonderzeichen
- 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\
9Sonderzeichen 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 - pit b) pt
- spot Pot
- spate peat
- slap two part
- respite
10Sonderzeichen 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
11Sonderzeichen Beispiel (1)
druck1.pl
text1.txt
- while (zeile ltSTDINgt)
- if (zeile /Wir/)
- print zeile
-
- Wir wollen Eis essen.
- Das hat keine Wirkung.
- Wirkungsgrad ist Null.
Aufruf perl w druck1.pl lt text1.txt Ausgabe?
12Sonderzeichen Beispiel (2)
druck2.pl
text2.txt
- while (zeile ltSTDINgt)
- if (zeile /ung\./)
- print zeile
-
- Die Bedienung kommt.
- Das hat keine Wirkung.
- Keine Ahnung!
Aufruf perl w druck2.pl lt text2.txt Ausgabe?
13Sonderzeichen 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) - /halo/ matcht halo hallo halllo zhalllllloxxx
- /halo/ matcht nicht hao
- bedeutet, dass das vorhergehende Zeichen
keinmal oder beliebig häufig vorkommen kann - /halo/ matcht hao halo hallo zhalllllloxxx
14Sonderzeichen Beispiel (3)
druck3.pl
text3.txt
- while (zeile ltSTDINgt)
- if (zeile /Ale/)
- print zeile
-
- Alle trinken Bier.
- Briten trinken Ale.
- Alte Hasen!
Aufruf perl w druck3.pl lt text3.txt Ausgabe?
15Sonderzeichen Beispiel (4)
druck4.pl
text4.txt
- while (zeile ltSTDINgt)
- if (zeile /Alt?e/)
- print zeile
-
- Alle trinken Bier.
- Briten trinken Ale.
- Alte Hasen!
- Frau Aterer kommt.
Aufruf perl w druck4.pl lt text4.txt Ausgabe?
16Sonderzeichen Beispiel (5)
druck5.pl
text5.txt
- while (zeile ltSTDINgt)
- if (zeile /./)
- print zeile
-
- Alle trinken Bier.
- Briten trinken Ale.
- Alte Hasen!
Aufruf perl w druck5.pl lt text5.txt Ausgabe?
17Sonderzeichen 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.
- /hal2o/ matcht xhalloy/hal2o/ matcht
nicht xhallloy halo - /hal2,o/ matcht hallo halllllox/hal2,o/ match
t nicht hao halo - /hal2,3o/ matcht hallo halllox/hal2,3o/ match
t nicht halo hallllox
18Zusammenfassung 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
19Ãœbung
- 1) abc 2) ac 3) abbb
- 4) bbc 5) aabcd 6) b
- Welche Zeichenketten(teile) werden jeweils
gematcht? - /abc?/
- /a?bc/
- /bc/
- /bc/
- /a.b?c/
- /b2,c?/
- /a1,2b.?d/
20Gruppierung ( )
- Mehrere Zeichen können mit runden Klammern
gruppiert werden. - Dadurch ist es möglich, die Wiederholungssonderzei
chen 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
21Ãœbung
- Welche der folgenden Zeichenketten wird von
/a(ab)a/ gematcht? - 1) abababa
- 2) aaba
- 3) aabbaa
- 4) aba
- 5) aabababa
22Alternative Zeichenketten
- Mit dem Pipe-Zeichen kann man mehrere
alternative Zeichenketten angeben. - /(HerrFrau) Mayer/ matcht Herr Mayer, Frau Mayer
- /A(nnll)e/ matcht Anne, Alle
- /HundKatzeMaus/ matcht Hund, Katzen, Mausi
if (wort /(beentergemissverzer)/)
print "wort beginnt mit einem Präfix!"
23Zeichenmenge
- Eine Menge von Zeichen in eckigen Klammern
bedeutet, dass genau eins dieser Zeichen gesucht
wird (egal welches). - /marcklo/ matcht marco, marko, marlo
- matcht nicht marcko, marmo
- /Maeiyer/ matcht Maier, Mayer, Meier, Meyer
- /aln2e/ matcht alle, anne, alne, anle
24Zeichenbereich -
- Wenn genau ein Zeichen aus einem Zeichenbereich
oder eine Ziffer aus einem Ziffernbereich gesucht
wird, so verwendet man den Bindestrich in eckigen
Klammern. - /ak-na/ matcht aka, ala, ama, ana
- /A-Za-z/ matcht alle Zeichenketten mit
einem Großbuchstaben gefolgt von mindestens
einem Kleinbuchstaben - /0-95/ matcht alle fünfstelligen
Dezimalzahlen (auch mit führenden Nullen)
25Ãœ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!?
26Negation 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!
- /amnla/ matcht aga, a a, a9a, mara
- matcht nicht ama, ana, ala
- /a-za/ matcht Mama, Larifari
- matcht nicht mama, alari, aMama
27Nachlesen und Ausprobieren!
- http//www.tekromancer.com/perl2/7.html
- http//gnosis.cx/publish/programming/regular_expre
ssions.html - http//www.itri.brighton.ac.uk/ARCHIVE/courses/MSc
Lex/exercises/regex/ - http//www.regular-expressions.info/quickstart.htm
l - http//www.ifi.unizh.ch/cl/siclemat/lehre/ss01/pcl
2/regextut