Regular Expressions - eine Einführung

27
Regular Expressions

description

Gastvortrag an der HTW Berlin am 8.Dezember 2011. Vorstellung von Regular Expressions.

Transcript of Regular Expressions - eine Einführung

Page 1: Regular Expressions - eine Einführung

Regular Expressions

Page 2: Regular Expressions - eine Einführung

Ziel

based on http://xkcd.com/208/ by Randall Munroe - used under CC-BY-NC

Page 3: Regular Expressions - eine Einführung

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#

Page 4: Regular Expressions - eine Einführung

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

Page 5: Regular Expressions - eine Einführung

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") !

Page 6: Regular Expressions - eine Einführung

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)!

Page 7: Regular Expressions - eine Einführung

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/!

Page 8: Regular Expressions - eine Einführung

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"); !}!

Page 9: Regular Expressions - eine Einführung

Zeichen

/hallo/! ja:!"hallo"!"aber hallo!"!"die hallobergrenze"!

nein:!"halo"!"Hallo"!"<span>h</span>allo"!

Page 10: Regular Expressions - eine Einführung

Oder

/en|sk|us|uk/! ja:!"en"!"sk"!"uk"!"ukulele"!

nein:!"esuu"!

Page 11: Regular Expressions - eine Einführung

Gruppieren

/(de|fr)_(DE|CH)/! ja:!"de_DE"!"fr_DE"!"de_CH"!"fr_CH"!

nein:!"de_AT"!"it_CH"!

Page 12: Regular Expressions - eine Einführung

Verankern

/^(en|sk|us|uk)$/! ja:!"en"!"sk"!"uk"!

nein:!"ukulele"!"esuuk"!

Page 13: Regular Expressions - eine Einführung

Zeichen zur Auswahl: Klasse

/^hall[oia]$/! ja:!"halli"!"hallo"!"halla"!

nein:!"hall"!"halloi"!"hallö"!

Page 14: Regular Expressions - eine Einführung

Zeichen zur Auswahl: Klasse

/^u[1-4]$/! ja:!"u1"!"u2"!"u3"!"u4"!

nein:!"u5"!"ux"!

Page 15: Regular Expressions - eine Einführung

Zeichen zur Auswahl: Komplement der Klasse

/^u[^1-4]$/! ja:!"u5"!"ux"!"u/"!

nein:!"u1"!"u2"!"u3"!"u4"!

Page 16: Regular Expressions - eine Einführung

Klasse der Ziffern

/^u\d$/! ja:!"u5"!"u9"!"u0"!

nein:!"ux"!"uz"!"udrei"!

Page 17: Regular Expressions - eine Einführung

Klasse der Wort-Zeichen

/^\w$/! die Zeichen, die man in Variablennamen verwenden darf:!

a-z, A-Z, 0-9, _!

Page 18: Regular Expressions - eine Einführung

Irgendein Zeichen

/^....$/! ja:!"1234"!"&$§_"!

nein:!"1"!"12345"!

Page 19: Regular Expressions - eine Einführung

Beliebig viele davon: der Stern-Operator

/^\d*$/! ja:!""!"1"!"123"!"1111"!

nein:!"1a"!

Page 20: Regular Expressions - eine Einführung

Mindestens eins davon: der + Operator

/^\d+$/! ja:!"1"!"123"!"1111"!

nein:!""!"1a"!

Page 21: Regular Expressions - eine Einführung

eins oder keins: der ? Operator

-  /^imis?$/ -  ja: -  "imi" -  "imis"

-  nein: -  "imissss"

Page 22: Regular Expressions - eine Einführung

Anzahl festlegen

/^\d{4}$/!

/^\d{3,6}$/!

genau 4 Ziffern!

3 bis 6 Ziffern!

Page 23: Regular Expressions - eine Einführung

Eins oder keins

/^imi\d?$/! ja:!"imi"!"imi0"!"imi9"!

nein:!"imi2011"!

Page 24: Regular Expressions - eine Einführung

mindestens eine ziffer

/^imi\d+$/! ja:!"imi0"!"imi9"!"imi2011"!

nein:!"imi"!

Page 25: Regular Expressions - eine Einführung

Operatoren sind "greedy"

/(\d*)/!

/_(.*)_/!

"01234567"! ^^^^^^^^!

"_bla_ _bla_"! ^^^^^! ^^^^^^^! ^^^^^^^^^^^!

den längsten möglichen String!!

Page 26: Regular Expressions - eine Einführung

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!

Page 27: Regular Expressions - eine Einführung

/(bb|[^b]{2})/

bb [^b] [^b]{2} bb|[^b]{2}