Regular Expressions - eine Einführung
-
Upload
brigitte-jellinek -
Category
Education
-
view
1.712 -
download
0
description
Transcript of Regular Expressions - eine Einführung
Regular Expressions
Ziel
based on http://xkcd.com/208/ by Randall Munroe - used under CC-BY-NC
Vorlesung und Übung zu Regular Expressions
- Irgendwas mit Strings: – match (erkennen) – replace (ersetzen)
- Theoretische Informatik: – Regulärer Ausdruck – equivalent zu – Endlicher Automat
(Finite State Machine)
- grep - vi, vim - sed, awk - perl - c, c++ - javascript - java, c#
Anwendungsbeispiele
$ grep POST log/development.log!Started POST "/modul/27-modul-netzwerke/book" for 127.0.0.1 at 2011-09-19 16:30:33 +0200 Started POST "/event/ditact-2011" for 127.0.0.1 at 2011-09-19 16:32:33 +0200 Started POST "/enroll/1659" for 127.0.0.1 at 2011-09-19 16:33:23 +0200 Started POST "/admin/event/ditact-2011/updatebookings" for 127.0.0.1 at 2011-09-19 16:36:18 +0200 Started POST "/admin/event/ditact-2011/updatebookings" for 127.0.0.1 at 2011-09-19 16:36:22 +0200 Started POST "/course_evaluation/76" for 127.0.0.1 at 2011-09-20 17:07:36 +0200 Started POST "/user/sign_in" for 127.0.0.1 at 2011-10-17 11:18:40 +0200
Cod
e co
de c
ode
code
cod
e
Anwendungsbeispiel PHP
# PHP: Aus Wordpress Plugins!if (preg_match('/^(http)(s?)(:)\/\//',$linky)){!
if (preg_match ( "/en|sk|zh|us|uk/", $locale_code )){!
# allgemein:!preg_match( "/regex/", "string in dem ich suche") !
Cod
e co
de c
ode
code
cod
e
Anwendungsbeispiel Javascript
# Javascript!if (navigator.appVersion.match(/MSIE [0-6]\./)) { !
if (formula.match(/^\d+$/)) { // just a number!
# Allgemein: regex hat eigene Syntax, ist ein!# eigener Datentyp!
string.match(/regex/)!
# für Fortgeschrittene: zur Laufzeit aus String bauen!r = new RegEx("/regex/")!r.execute(string)!
Cod
e co
de c
ode
code
cod
e
Anwendungsbeispiel Ruby
# Ruby!if env['HTTP_USER_AGENT'] =~ /chromeframe/!
if line =~ /^committer: (.+)$/!
next unless f =~ /^https?:\/\//!
# Allgemein: RegEx hat eigene Syntax!
string =~ /regex/!
Cod
e co
de c
ode
code
cod
e
Anwendungsbeispiel C#
# c# Aus http://support.microsoft.com/kb/308252!using System.Text.RegularExpressions;!Regex emailregex = new Regex("@");!String s = "[email protected]";!
Match m = emailregex.Match(s);!
if ( m.Success ) { !Console.WriteLine("ja"); !}!
Zeichen
/hallo/! ja:!"hallo"!"aber hallo!"!"die hallobergrenze"!
nein:!"halo"!"Hallo"!"<span>h</span>allo"!
Oder
/en|sk|us|uk/! ja:!"en"!"sk"!"uk"!"ukulele"!
nein:!"esuu"!
Gruppieren
/(de|fr)_(DE|CH)/! ja:!"de_DE"!"fr_DE"!"de_CH"!"fr_CH"!
nein:!"de_AT"!"it_CH"!
Verankern
/^(en|sk|us|uk)$/! ja:!"en"!"sk"!"uk"!
nein:!"ukulele"!"esuuk"!
Zeichen zur Auswahl: Klasse
/^hall[oia]$/! ja:!"halli"!"hallo"!"halla"!
nein:!"hall"!"halloi"!"hallö"!
Zeichen zur Auswahl: Klasse
/^u[1-4]$/! ja:!"u1"!"u2"!"u3"!"u4"!
nein:!"u5"!"ux"!
Zeichen zur Auswahl: Komplement der Klasse
/^u[^1-4]$/! ja:!"u5"!"ux"!"u/"!
nein:!"u1"!"u2"!"u3"!"u4"!
Klasse der Ziffern
/^u\d$/! ja:!"u5"!"u9"!"u0"!
nein:!"ux"!"uz"!"udrei"!
Klasse der Wort-Zeichen
/^\w$/! die Zeichen, die man in Variablennamen verwenden darf:!
a-z, A-Z, 0-9, _!
Irgendein Zeichen
/^....$/! ja:!"1234"!"&$§_"!
nein:!"1"!"12345"!
Beliebig viele davon: der Stern-Operator
/^\d*$/! ja:!""!"1"!"123"!"1111"!
nein:!"1a"!
Mindestens eins davon: der + Operator
/^\d+$/! ja:!"1"!"123"!"1111"!
nein:!""!"1a"!
eins oder keins: der ? Operator
- /^imis?$/ - ja: - "imi" - "imis"
- nein: - "imissss"
Anzahl festlegen
/^\d{4}$/!
/^\d{3,6}$/!
genau 4 Ziffern!
3 bis 6 Ziffern!
Eins oder keins
/^imi\d?$/! ja:!"imi"!"imi0"!"imi9"!
nein:!"imi2011"!
mindestens eine ziffer
/^imi\d+$/! ja:!"imi0"!"imi9"!"imi2011"!
nein:!"imi"!
Operatoren sind "greedy"
/(\d*)/!
/_(.*)_/!
"01234567"! ^^^^^^^^!
"_bla_ _bla_"! ^^^^^! ^^^^^^^! ^^^^^^^^^^^!
den längsten möglichen String!!
Warnhinweis
- Es gibt Ding, die man nicht mehr mit Regular Expressions in den Griff bekommt
- Siehe Theoretische Informatik: – reguläre Ausdrück = Chomsky Hierarchie Typ 3 – kontextfreie Grammatik = Chomsky Hierarchie Typ 2
- Alle Computersprachen, XML, HTML sind Typ 2 - Man braucht also einen richtigen Parser dafür!
/(bb|[^b]{2})/
bb [^b] [^b]{2} bb|[^b]{2}