Regular Expressions - eine Einführung

Post on 05-Dec-2014

1.713 views 0 download

description

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

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 = "johndoe@tempuri.org";!

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}