Expresiones Regulares
## Objetivos de Aprendizaje
- Dominar la coincidencia de patrones
- Usar sustituciones y transliteraciones
- Trabajar con qr// para patrones compilados
- Comprender los modificadores de regex
- Dominar la sintaxis de comillas para regex
## Coincidencia Basica
### Operador =~
```perl
use strict;
use warnings;
my $texto = "Hola, Mundo!";
if ($texto =~ /Mundo/) {
print "Encontrado!\n";
}
my $encontrado = $texto =~ /Mundo/; # 1 o undef
```
### Coincidencia con Variables
```perl
my $patron = "Mundo";
my $texto = "Hola, Mundo!";
if ($texto =~ /$patron/) {
print "Coincidencia!\n";
}
```
### Variable Por Defecto $_
```perl
use strict;
use warnings;
$_ = "Hola, Mundo!";
if (/Mundo/) {
print "Encontrado en \$_\n";
}
print "Encontrado" if /Mundo/;
```
## Modificadores de Regex
### Modificadores Comunes
```perl
my $texto = "Hola MUNDO";
/mundo/i; # i - Insensible a mayusculas
/HOLA/i; # Coincide con "HOLA", "hola", "Hola", etc.
my $multilinea = "linea1\nlinea2\npatron\nlinea4";
$multilinea =~ /^patron/m; # m - Multilinea (^ coincide con inicios de linea)
my $contenido_archivo = "primero\nsegundo\ntercero";
$contenido_archivo =~ /\Aprimero/; # \A coincide con inicio absoluto
$contenido_archivo =~ /\ztercero/; # \z coincide con fin absoluto
```
### Modificadores Extendidos
```perl
my $texto = "Linea de comentario\n codigo indentado";
$texto =~ /^\s+#\s+(\w+)/x; # x - Extendido (permitir espacios y comentarios)
my $balanceado = "((a + b) * c)";
$balanceado =~ /\((?:[^()]++|\([^()]*\))+\)/; # + - Possesivo (sin backtrack)
my $str = "a\nb\nc";
$str =~ /a.*\n.*\n.*/s; # s - Linea unica (. coincide con \n)
```
## Clases de Caracteres
### Clases Basicas
```perl
/[abc]/; # a, b, o c
/[^abc]/; # NO a, b, o c
/[a-z]/; # letra minuscula
/[A-Z]/; # letra mayuscula
/[0-9]/; # digito
/[a-zA-Z0-9]/; # alfanumerico
```
### Clases Abreviadas
```perl
/\d/; # Digito [0-9]
/\D/; # No digito [^0-9]
/\w/; # Caracter de palabra [a-zA-Z0-9_]
/\W/; # Caracter no palabra
/\s/; # Espacio en blanco [ \t\n\r\f]
/\S/; # No espacio en blanco
```
### Ejemplos
```perl
my $telefono = "123-456-7890";
if ($telefono =~ /\d{3}-\d{3}-\d{4}/) {
print "Telefono valido\n";
}
my $ip = "192.168.1.1";
if ($ip =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/) {
print "Parece una IP\n";
}
```
## Cuantificadores
### Cuantificadores Basicos
```perl
/a*/; # Cero o mas a's
/a+/; # Uno o mas a's
/a?/; # Cero o uno a
/a{3}/; # Exactamente 3 a's
/a{3,}/; # Tres o mas a's
/a{3,5}/; # Entre 3 y 5 a's
```
### Greedy vs Minimal
```perl
my $html = "negrita y italica";
$html =~ /<.+>/; # Greedy: coincide con todo
$html =~ /<.+?>/; # Minimal: coincide con ... luego ...
my $texto = "abc123def";
$texto =~ /\d+/; # "123" (greedy)
$texto =~ /\d+?/; # "1" (minimal)
$texto =~ /\d*?/; # "" (cero es coincidencia minimal)
```
## Anclas
### Anclas de Posicion
```perl
/^abc/; # Inicio de cadena (o linea con /m)
/abc$/; # Fin de cadena (o linea con /m)
/\A/; # Inicio absoluto de cadena
/\z/; # Fin absoluto de cadena
/\b/; # Limite de palabra
/\B/; # No limite de palabra
```
### Limites de Palabra
```perl
my $texto = "el ellos tema";
$texto =~ /\bel\b/; # Coincide con "el" pero no con "ellos" o "tema"
$texto =~ /\Bel\B/; # Coincide con "el" en "tema" pero no solo
```
## Grupos de Captura
### Captura Basica
```perl
my $fecha = "2024-01-15";
if ($fecha =~ /(\d{4})-(\d{2})-(\d{2})/) {
print "Ano: $1\n"; # 2024
print "Mes: $2\n"; # 01
print "Dia: $3\n"; # 15
}
```
### Grupos No Capturadores
```perl
my $texto = "abc123def";
# Capturando
if ($texto =~ /(\d+)/) {
print "Numero: $1\n"; # 123
}
# No capturando (?:...)
if ($texto =~ /(?:abc)(\d+)/) {
print "Numero: $1\n"; # 123 (aun $1, abc no es capturado)
}
```
### Capturas Nombradas
```perl
use 5.010;
my $fecha = "2024-01-15";
if ($fecha =~ /(?\d{4})-(?\d{2})-(?\d{2})/) {
print "$+{ano}-$+{mes}-$+{dia}\n";
}
```
## Alternacion
### Alternacion Basica
```perl
my $color = "azul";
if ($color =~ /rojo|verde|azul/) {
print "Color primario o azul\n";
}
my $extension = "txt";
if ($extension =~ /jpg|png|gif|bmp/) {
print "Archivo de imagen\n";
}
```
### Precedencia
```perl
# | tiene baja precedencia
/mi (perro|gato)s son (lindos|rapidos)/; # Correcto
# vs agrupacion
/mi (perros|gatos) son (lindos|rapidos)/;
```
## Backreferences
### Coincidir Caracteres Repetidos
```perl
# Coincidir cadenas entre comillas (simples o dobles)
my $texto = "'hola' y \"mundo\"";
if ($texto =~ /(['"])(.*?)\1/) { # \1 coincide con la misma comilla
print "Entre comillas: $2\n";
}
```
### Backreferences en Patrones
```perl
# Coincidir palabra repetida
my $oracion = "el el gato";
if ($oracion =~ /\b(\w+)\s+\1\b/) {
print "Repetido: $1\n"; # "el"
}
```
## Sustituciones
### Sustitucion Basica
```perl
my $texto = "Hola Mundo";
$texto =~ s/Mundo/Perl/;
print $texto; # "Hola Perl"
# En lugar con valor de retorno
my $nuevo = $texto =~ s/Mundo/Perl/r;
```
### Sustitucion Global
```perl
my $texto = "aaa bbb aaa ccc";
$texto =~ s/aaa/bbb/g; # Todas las ocurrencias
print $texto; # "bbb bbb bbb ccc"
# Global insensible a mayusculas
my $palabras = "Manzana manzana MANZANA";
$palabras =~ s/manzana/fruta/gi; # Todas, insensible a mayusculas
```
### Multiples Sustituciones
```perl
my $texto = "hola mundo";
$texto =~ s/hola/hi/r =~ s/mundo/perl/r =~ s/hi/perl/r;
# Encadenamiento (retorna resultado final)
```
## Transliteracion (tr///)
### tr Basico
```perl
my $texto = "hola";
$texto =~ tr/a-z/A-Z/; # "HOLA"
my $dna = "ACGT";
$dna =~ tr/ACGT/TGCA/; # "TGCA"
```
### tr/// vs s///
```perl
# tr/// - caracter por caracter
"abab" =~ s/ab/cd/g; # "cdcd" (sustitucion)
/ab/ab/cd/g; # "cdcd" (sustitucion)
/ab/cd/g; # "cdcd" (transliteracion)
# s/// - sustitucion con regex
"abab" =~ s/ab+/cd/g; # "cdcd" (reemplaza 'ab' con 'cd')
```
### Contando con tr
```perl
my $texto = "hola mundo";
my $count = ($texto =~ tr/o//); # 2
print "Encontrados $count o's\n";
# Eliminar
my $limpio = $texto =~ tr/a-z//cdr; # Remover no letras
```
## qr// Patrones Compilados
### Uso Basico
```perl
my $patron = qr/\d{3}-\d{4}/;
if ("123-4567" =~ $patron) {
print "Coincidencia!\n";
}
if ("123-456-7890" =~ $patron) {
print "Tambien coincide!\n"; # Coincidencia parcial
}
```
### Combinando Patrones
```perl
my $digito = qr/\d+/;
my $guion = qr/-/;
my $telefono = qr/^$digito$guion$digito$/;
"123-456" =~ $telefono; # Coincide
```
### Con Modificadores
```perl
my $insensible = qr/hola/i;
my $multilinea = qr/^hola/im;
my $compilado = qr/hola\s+mundo/ix;
```
## split con Regex
```perl
my $texto = "uno,dos,tres";
my @partes = split /,/, $texto; # ("uno", "dos", "tres")
my $fecha = "2024-01-15";
my ($ano, $mes, $dia) = split /-/, $fecha;
# Con limite
my @palabras = split /\s+/, "uno dos tres", 2; # ("uno", "dos tres")
# Split con regex
my $linea = "abc123def456ghi";
my @nums = split /\D+/, $linea; # ("", "123", "456", "ghi")
```
## Coincidencias Globales
### Coincidir Todas las Ocurrencias
```perl
my $texto = "abc123def456";
my @coincidencias = $texto =~ /\d+/g;
print "@coincidencias\n"; # "123" "456"
# Con capturas
my @todos_numeros = $texto =~ /(\d+)/g;
print "@todos_numeros\n"; # "123" "456"
```
### Iteracion
```perl
my $texto = "Precio: \$100, Descuento: \$50";
while ($texto =~ /\$\d+/g) {
print "Encontrado: $&\n"; # $& es la cadena coincidente
}
# Con capturas
while ($texto =~ /(\$)(\d+)/g) {
print "Moneda: $1, Monto: $2\n";
}
```
## Variables Especiales
```perl
$& # Cadena completa coincidente
$` # Cadena antes de la coincidencia
$' # Cadena despues de la coincidencia
$1 # Primera captura
$2 # Segunda captura
$+ # Ultima captura
$+{nombre} # Captura nombrada (5.10+)
```
## Lookahead y Lookbehind
### Lookahead
```perl
# Lookahead positivo (?=...)
my $texto = "foobar";
if ($texto =~ /foo(?=bar)/) { } # Coincide "foo" solo si seguido por "bar"
# Lookahead negativo (?!...)
if ($texto =~ /foo(?!bar)/) { } # Coincide "foo" solo si NO seguido por "bar"
```
### Lookbehind
```perl
# Lookbehind positivo (?<=...)
my $precio = "\$100";
if ($precio =~ /(?<=\$)\d+/) { } # Coincide digitos despues de "$"
# Lookbehind negativo (?...)`
- Alternacion con `|`
- Sustitucion: `s/patron/reemplazo/g`
- Transliteracion: `tr///` para mapeo de caracteres
- `qr//` compila patrones para reutilizacion
- Modificadores: `/i`, `/g`, `/m`, `/s`, `/x`
- Coincidencia global con `/g` retorna todas las coincidencias
Comments
Comments powered by Giscus
To enable comments, add your Giscus embed code here.
Learn more about Giscus →