introducción a las expresiones regulares
DESCRIPTION
Presentación sobre expresiones regulares del primer curso de introducción a Perl de los Barcelona Perl MongersTRANSCRIPT
//
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!