Introducción a las Expresiones Regulares

Post on 18-Dec-2014

2.682 views 0 download

description

Presentación sobre expresiones regulares del primer curso de introducción a Perl de los Barcelona Perl Mongers

Transcript of Introducción a las Expresiones Regulares

//

Expresiones Regulares

Que es una expresión regular?

• Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos

• Larry Wall decidió incorporar expresiones regulares como parte de Perl

• “Regular expressions and Matching” del libro Modern Perl

• Un lenguaje dentro de un lenguaje

Dos Tipos

• Matching– //– m//

• Substitution– s///

Matching

my $string = ‘Mi perro se llama Pepe’;if ($string =~ m/perro/) { $perros ++;}if ($string =~ m/pepe/) { $pepes ++;}

Matching

my $string = ‘Mi perro se llama Pepe’;if ($string =~ m/perro/) { $perros ++;}if ($string =~ m/pepe/) { $pepes ++;}

Matching

my $string = ‘Mi perro se llama Pepe’;if ($string =~ m/perro/) { $perros ++;}if ($string =~ m/pepe/) { $pepes ++;}

my $string = ‘Mi perro se llama Pepe’;if ($string =~ m/perro/) { $perros ++;}if ($string =~ m/pepe/i) { $pepes ++;}

Las regexp son “case sensitive”

Modificador

Sobre modificadores

• i -> case insensitive• g -> global• e -> evaluate• …

Pero ahora…

• Mi perro se llama PEPE– pepes++

• m/[Pp]epe/

Character class

Character classes

• [aA]• [abc]• [aeiou]• [a-z]• [a-zA-Z]• [0-9]• [a-z-]

Metacarácteres

• \w -> alfanumérico• \d -> digito• \s -> espacio en blanco (y tabs!)• . -> Cualquier carácter (menos un salto de

linea)

• \b -> Word boundary (cambio entre \w y \W)

Metacarácteres

• \W -> NO alfanumerico• \D -> NO digito• \S -> NO espacio en blanco (y tabs!)

my $string = ‘Mi perro se llama Pepe’;if ($string =~ m/^se llama \w$/i) {

}

Usando las clases

my $string = ‘Mi perro se llama Z’;if ($string =~ m/^se llama \w$/i) {

}

Usando las clases

my $string = ‘Mi perro se llama Pepe’;if ($string =~ m/^se llama \w+$/i) {

}

Usando las clases

Cuantificador

Cuantificadores• ? -> 0 o 1

– /ca?t/• ct• cat• caaat

• + -> 1 o más– /ba+/

• ba• baa• Bb

• * -> 0 o más– /ba*/

• ba• baa• Bb

• {N,M}– /a{3,4}/

• baa• baaa• baaaa• baaaaa

Un breve inciso: Escapando

• Quiero escribir una expresión regular que reconozca la cadena “{1,3}”

• print "Reconocido" if ("{1,3}" =~ m/{1,3}/);– Syntax error

• print "Reconocido" if ("{1,3}" =~ m/\{1,3\}/);

Capturando datos

• Los paréntesis capturan datos– ()– Rellenan las variables $1, $2, …, $9

• Capturas con nombre– (?<nombre>…)– Rellena la variable $+{nombre}

Capturas

my @phrases = ( ‘Mi perro se llama pepe’, ‘Mi gato se llama Garfield‘);my %tipos, %nombres;foreach my $phrase (@phrases) {

if ($phrase =~ m/Mi (\w+) se llama (\w+)/){ my ($tipo, $nombre) = ($1, $2); $tipos{ $tipo } ++; $nombres{ $nombre }++; }}

Capturas II

my ($tipo, $nombre) = ($phrase =~ m/Mi (\w+) se llama (\w+)/);

$string = "Tengo un gato siberiano y un perro pastor";while ($string =~ m/(?|perro|gato) (\w+)/g){ print "Animal: $1\n";}

No captura!(?| )

Global

Greedyness

• + y * son “greedy” (avariciosos)– Intentan consumir el máximo de caracteres

posibles

• "Tengo un gato siberiano“ =~ m/Tengo un (.*o)/;– $1 == ‘gato siberiano’

• "Tengo un gato siberiano“ =~ m/Tengo un (.*?o)/;– $1 == ‘gato’

Substitution

$string = "Tengo un gato siberiano";$string =~ s/siberiano/persa/;

$string == “Tengo un gato persa”

Substitution

$string = "Tengo un gato siberiano";$string =~ s/\w+/persa/;

Substitution

$string = "Tengo un gato siberiano";$string =~ s/\w+/persa/;

“persa un gato siberiano”

Substitution

$string = "Tengo un gato siberiano";$string =~ s/\w+/persa/g;

“persa persa persa persa” GLOBAL

Substitution on steroids

$string = "Tengo un gato siberiano";$string =~ s/\w+/ pluraliza($1) /ge;

$string == “Tenemos unos gatos siberianos”

Código Perl!