Una expresión regular es una expresión que describe un conjunto de cadenas sin enumerar sus elementos. Las expresiones regulares permiten realizar búsquedas de cadenas y reemplazos de texto mediante el uso de caracteres especiales, clases de caracteres, cuantificadores y capturas. Las expresiones regulares son una parte fundamental del lenguaje Perl.
2. 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
3. • “Regular expressions and Matching” del libro
Modern Perl
• Un lenguaje dentro de un lenguaje
12. 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)
13. Metacarácteres
• W -> NO alfanumerico
• D -> NO digito
• S -> NO espacio en blanco (y tabs!)
14. Usando las clases
my $string = ‘Mi perro se llama Pepe’;
if ($string =~ m/^se llama w$/i) {
}
15. Usando las clases
my $string = ‘Mi perro se llama Z’;
if ($string =~ m/^se llama w$/i) {
}
16. Usando las clases
my $string = ‘Mi perro se llama Pepe’;
if ($string =~ m/^se llama w+$/i) {
}
Cuantificador
17. 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
18. 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}/);
19. Capturando datos
• Los paréntesis capturan datos
– ()
– Rellenan las variables $1, $2, …, $9
• Capturas con nombre
– (?<nombre>…)
– Rellena la variable $+{nombre}
20. 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 }++;
}
}
21. 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: $1n";
}
No captura! Global
(?| )
22. 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’