← Perl EspañolChapter 08 of 13

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 →