RegExp Vortrag @ Computer Stammtisch Harburg 2008-10-29 ========================================================= Reguläre Sprache -> Computerlinguistik/Automatentheorie eigentlich Typ 3 Grammatik in der Chomsky Hierarchie durch backreference erweitert POSIX Regexp ähnelt einer Regulären Sprache Darstellung meist in Extended Backus-Naur Form Anwendungen ----------- Regexp wird u.a. verwendet in GNU/grep, GNU/coreutils (expr STRING : REGEXP), Vi/Vim, Apache (Jakarta), Oracle >=10g, MS Word, OpenOffice, Java, JavaScript, Python, Ruby, PHP, .NET, allgemein Syntax highlighting, Google Code Search, QT (QRegExp), Boost Regex (Boost C++ Libs), SAP ABAP, TCL, D, Haskell, pcregrep, sed, awk, (postfix body_checks) PCRE = Perl Compatible Regular Expressions (C Bibliothek) (http://www.pcre.org/) Hilfe ----- ausgeteiltes Cheat Sheet von Dave Child http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/ unter http://creativecommons.org/licenses/by-nc-sa/2.0/uk/ perldoc perlre (http://perldoc.perl.org/perlre.html) oder kürzer: perldoc perlrequick (http://perldoc.perl.org/perlrequick.html) perldoc perlretut (Tutor) (Perl kann mit PCRE ausgestattet werden) http://www.regular-expressions.info Metazeichen ----------- []()\^$.|?*+ wenn nicht als Metazeichen benutzt: schützen mit \ (allgemein) oder \Q..\E (Perl, PCRE, Java) Allgemein: besser '' als "" nutzen (Perl: "@%$", Shell: "$", Windows: "c:\\\\temp") Zeichenklassen -------------- . beliebiges Zeichen ohne Zeilenumbruch (Achtung Unicode!) \w=Matches an alphanumeric character, including "_" (Gegenteil: \W) \d=[[:digit:]] (\D) \s=[ \t\r\n\v\f] (\S) white space Aufzählungen ------------- + 1 und mehr * 0 und mehr ? 0 oder 1 mal: colou?r | oder (Kaff|T)ee {2} 2-mal {3,} 3 und mehr {,5} bis zu 5 {3,5} 3, 4 oder 5-mal $ip =~ /(\d{1,3}\.){3}\d{1,3}/; Bereiche -------- ^ Anfang der Zeile $ Ende der Zeile \b word boundry "cat luvz lolcat"=~/\bcat\b/; Mengen ------ [0-9a-fA-F] hex Zeichen [^\s] = \S Negierung Matching -------- "foo2008-10-29bar"=~/(\d{4})-(\d{2})-(\d{2})/ print $3.".".$2.".".$1; Backreference ------------- \1 \2 (\w{2})\1 = mama, papa, caca, LaLa, ... Minimal matching ---------------- Rexexp ist standardmäßig "gefräßig" <[^>]*> = <.*?> ("Gegenteil": Atomic grouping mit ++) Unicode ------- Unicode: 1-3 ByteZeichen! Ein "." ist nur erster Unicodeteil! Perl: \X (inkl. Zeilenumbruch) bei Java, .NET: \P{M}\p{M}* via "Unicode Character Properties": \p{} und \P{} (siehe http://www.regular-expressions.info/unicode.html) Encoding: Java: \uFFFF, Perl/PCRE: \x{FFFF} Beispiele --------- * E-Mailadressen matchen nach RFC 2822: (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\ x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@( ?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?: 25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9 ]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01- \x09\x0b\x0c\x0e-\x7f])+)\]) nicht RFC: [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a -z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])? bzw. [a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a -z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero| jobs|museum)\b in PHP: foreach(preg_split('/[\s,;:"#<>]+/', $addresses) as $m) { if(preg_match('/^[^\s@]+@[\d\w\-.]+\.\w+$/', $m)){ $counter[$m]++; $ret[]=$m; } } * GNU/grep grep -ve '^#' grep -ve '^\s*#' grep -ve '^\s*$' * Perl match m// $str=~m/\b(Kaff|T)ee\b/; while(<>){ print if /Linux/i; } $x = "cat dog house"; @words = ($x =~ /(\w+)/g); @words=("cat", "dog", "house"); * Perl Substitution $str=~s/^([^ ]+) ([^ ]+)/$2 $1/; # nicht \1 $str=~s#\s+# #g; * Perl split $x = "Calvin and Hobbes"; @words = split /\s+/, $x; * Perl grep @foo = grep(!/^#/, @bar); -- 2008-10-29, Sven Uebelacker , Creative Commons BY-NC-SA 3.0 http://creativecommons.org/licenses/by-nc-sa/3.0/de/ https://www.uebelhacker.de/stammtisch/