Regular expressions for pros Reguläre Ausdrücke für

Regular expressions for pros
Reguläre Ausdrücke für
Fortgeschrittene (Perl)
Elena Neuburg
S
Inhaltsverzeichnis
S 
Definition
S 
Pattern Matching
§ 
Greediness
§ 
Eagerness
§ 
Backtracking
S 
Nützliche Optionen
S 
Backreferences und Lookaround-Bedingungen
2
Reguläre Ausdrücke
S  Reguläre Ausdrücke (oder kurz: Regexps von engl. regular
expressions) stellen in der Programmierung verallgemeinerte
Suchmuster dar. Mithilfe dieser Suchmuster können Sie
beispielsweise Variableninhalte durchsuchen und bestimmte
Inhalte daraus herausziehen oder ersetzen.
3
Probleme!!!
S  Greediness
S  Eagerness
S  Backtracking
4
Pattern Matching
Greediness (Gefräßigkeit )
zeichnet sich dadurch aus, dass sie schrittweise den Folgezustand auswählt, der zum
Zeitpunkt der Wahl den größten Gewinn bzw. das beste Ergebnis verspricht
<tok><sur>esse</sur><lem cat="v" mor="1sp">essen</lem></tok>
Lösungen:
S  a) $line =~ /cat=" (.*) "/;
$wortart = $1;
$wortart= v" mor="1sP
b) $line =~ /cat=" ([^\"]*) "/;
$wortart= v
c) $line =~ /cat=" (.*?) "/;
$wortart= v
5
Eagerness (Eifer)
versucht, so schnell wie möglich einen Match zum Erfolg zu bringen. Ab
und zu sogar schneller als man das erwartet hat
$string = "good food";
$string=~s/o*/e/;
good food
geod food
geed food
geed feed
ged food
ged fed
egood food
$string=~s/o*/e/g;
Ergebnis egeede efeede
6
Greediness vs. Eagerness
S  "leftmost longest match“: einerseits versucht Perl immer
den längst möglichen Match zu finden, andererseits immer
den erstmöglichen.
my $string ="abracadabra";
$string =~ /(a|cadabra)+/;
print "$1\n";
Ergebnis: a
7
Backtracking (Rückwärtsreferenz) mit Hilfe von Klammern wird ein
Teil des Suchmusters markiert, darauf man sich später wieder beziehen kann
$_ = "Food is on the foo table.";
if ( /\b(foo)\s+(\w+)/i ) {
print "$2 follows $1.\n"; }
Ergebnis table follows foo.
my $string ="abracadabra";
$string =~ /(a|ab) ra/;
print " Gesamtmatch am Ende: $string\n";
Ergebnis abracadabra
8
Nützliche Optionen
Modifier
Eselsbrücke
Bedeutung
g
global
globales Matchen, d.h. alle Vorkommnisse
finden.
my $str = "Gestern ist mir ein Waschlappen vom Haken gefallen.
Daraufhin habe ich ihn wieder auf den Waschlappenhaken gehängt. ";
while($str=~/([a-z]{3}) waschlappen/ig){
print " $1\n";
}
Ergebnis: ein
den
9
Modifier
Eselsbrücke
Bedeutung
x
extend legibility
bessere Lesbarkeit zulassen durch Kommentare
und Whitespace.
my $str = "Gestern ist mir ein Waschlappen vom Haken gefallen.
Daraufhinhabe ich ihn wieder auf den Waschlappenhaken gehängt. ";
while($str=~/([a-z]{3})
\
waschlappen
# drei Buchstaben
# ein Leerzeichen
# der String "waschlappen“
/igx){
print " $1 \n";
}
10
Modifier
Eselsbrücke
Bedeutung
m
multi-line
Interpretation des Strings als mehrere Zeilen.
Die Anchors ^ und $ matchen damit nicht
mehr nur String-Anfange bzw. -Ende, sondern
Zeilen-Anfang bzw. -Ende.
s
single line
Punkt jedes Zeichen, auch Zeilenumbrüche(!),
matchen lassen.
my $zeile= "This is my\nmulti-line string";
if ($zeile=~ /^(.*)$/m){ print "$1\n"; }
Ergebnis $1 = This is my
my $zeile= "This is my\nmulti-line string";
if ($zeile=~ /^(.*)$/s){ print "$1\n"; }
Ergebnis $1 = This is my
multi-line string
11
Backreferences und Lookaround-Bedingungen
Backreferences (Rückbezüge) bezieht sich auf einen
vorangegangenen Teil des Patterns (in runden Klammern)
und enthält deren Inhalt.
S  $line =~ /\b(\w+) $1\b/; # falsch!
S  $line =~ /\b(\w+) \1\b/; #richtig
S  HTML tags <B><I>bold italic</I></B> text
$regex =~ <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>.
12
Lookaround-Bedingungen
$_ = "Coach Pep Guardiola erlebte gestern eine Niederlage";
print "$1 " while /\b(\w+) +([A-Z])/g;
Ergebnis Coach eine
print "$1 " while /\b(\w+) +(?=[A-Z])/g;
Ergebnis Coach Pep eine
(positive Variante)
while /\b(\w+) +(?![A-Z])/g;
Ergebnis Guardiola erlebte gestern
(negative Variante)
13
S  Lookbehind
my $money = "1234.5678";
$money =~ s/(?<=\d)(?=(?:\d\d\d)+$)/,/g;
Ergebnis 1234.5,678
(positive Variante)
my $money = "1234.5678";
$money =~ s/(?<!\.\d)(?<=\d)(?=(?:\d\d\d)+\b)/,/g;
Ergebnis 1,234.5678
(negative Variante)
14
Syntax
S  positiver Lookahead: (?=PATTERN)
S  negativer Lookahead: (?!PATTERN)
S  positiver Lookbehind: (?<=PATTERN)
S  negativer Lookbehind: (?<!PATTERN)
15
Zusammenfassung
S 
Greediness, Eagerness und Backtracking sind eine schnelle Lösung für viele Probleme
dennoch oft nicht optimal. (oft eine Falle!!!)
S 
Um gleiche Muster im Text zu finden braucht man Backreferences
S 
Nützliche Optionen (g x m s)
S 
Lookaround erlaubt vor oder nach dem Muster „anzuschauen“, ohne in das Muster
einzuziehen
S 
Negativ: bei einem einzigen Fehler in der Anwendung kann das gesamte Programm
nutzlos sein.
S 
Positiv an Perl ist: Beherrscht man es, dann hat man ein wirklich gutes
Anwendungsprogramm mit einem „sauberen Ergebnis“.
16
Zusammenfassung
17
http://imgs.xkcd.com/comics/
regular_expressions.png
Referenzen
S 
1. Dr. Helmut Schmid: „Angewandtes Programmieren PERL für Fortgeschrittene“
http://www.cis.uni-muenchen.de/~schmid/lehre/AngewandtesProgrammierenPerl/Skript.pdf
2. http://www.regular-expressions.info/backref.html (02.05.15)
3. http://wiki.selfhtml.org/wiki/Perl/Regul%C3%A4re_Ausdr%C3%BCcke (02.05.15)
4. http://perldoc.perl.org/perlre.html#Version-8-Regular-Expressions (02.05.15)
5. Christiansen, T „Perl Cookbook“ O´Reilly: 2003 S.181
6. Brian d foy „Mastering Perl. Creating Professional Programs with Perl“O´Reilly: 2014 S.23
7. http://www.bs7-augsburg.de/aicher/files_codeconcert/12Prog/ANPR_01_RegexInJava.pdf (04.05.15)
18