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
© Copyright 2024 ExpyDoc