Expresiones regulares de Perl

Una expresión regular describe un patrón de coincidencia de cadenas, que se puede utilizar para comprobar si una cadena contiene algún tipo de subcadena, reemplazar las subcadenas coincidentes o extraer de una cadena las subcadenas que cumplen cierta condición.

Las expresiones regulares de Perl son muy potentes, básicamente las más potentes entre los lenguajes de uso común. Muchos lenguajes han tomado como referencia las expresiones regulares de Perl al diseñar su soporte de expresiones regulares.

Las tres formas de expresiones regulares en Perl son: coincidencia, sustitución y transliteración:

  • Coincidencia: m// (también se puede abreviar como //, omitiendo m)

  • Sustitución: s///

  • Transliteración: tr///

Estas tres formas generalmente se combinan con=~o!~=~ y !~; =~ indica coincidencia, !~ indica no coincidencia.


Operador de coincidencia

El operador de coincidencia m// se utiliza para hacer coincidir una cadena o una expresión regular. Por ejemplo, para hacer coincidir "run" en el escalar $bar, el código es el siguiente:

Ejemplo

#!/usr/bin/perl $bar = "I am ejemplo site. welcome to ejemplo site."; if ($bar =~ /run/){ print "Primera coincidencia\n"; }else{ print "Primera no coincidencia\n"; } $bar = "run"; if ($bar =~ /run/){ print "Segunda coincidencia\n"; }else{ print "Segunda no coincidencia\n"; }

Al ejecutar el programa anterior, el resultado es:

Primera coincidencia

Modificadores de coincidencia de patrones

La coincidencia de patrones tiene algunos modificadores comunes, como se muestra en la siguiente tabla:

ModificadorDescripción
iIgnorar mayúsculas y minúsculas en el patrón
m Modo multilínea
oAsignar solo una vez
sModo de una sola línea: "." coincide con "\n" (por defecto no coincide)
xIgnorar los espacios en blanco en el patrón
gCoincidencia global
cgDespués de que falla la coincidencia global, permite buscar nuevamente la cadena coincidente

Variables de expresión regular

Después del procesamiento, Perl guarda los valores coincidentes en tres variables especiales:

  • $`: La cadena anterior a la parte coincidente
  • $&: La cadena coincidente
  • $': La cadena restante que aún no se ha coincidido

Si se colocan estas tres variables juntas, se obtiene la cadena original.

El ejemplo es el siguiente:

Ejemplo

#!/usr/bin/perl $string = "welcome to ejemplo site."; $string =~ m/run/; print "Cadena antes de la coincidencia:$`\n"; print "Cadena coincidente: $&\n"; print "Cadena después de la coincidencia:$'\n";

Al ejecutar el programa anterior, el resultado es:

匹配前的字符串: welcome to 
匹配的字符串: run
匹配后的字符串: oob site.

Operador de sustitución

El operador de sustitución s/// es una extensión del operador de coincidencia; reemplaza la cadena especificada con una nueva cadena. El formato básico es el siguiente:

s/PATTERN/REPLACEMENT/;

PATTERN es el patrón de coincidencia y REPLACEMENT es la cadena de reemplazo.

Por ejemplo, reemplazaremos "google" por "ejemplo" en la siguiente cadena:

Ejemplo

#!/usr/bin/perl $string = "welcome to google site."; $string =~ s/google/ejemplo/; print "$string\n";

Al ejecutar el programa anterior, el resultado es:

welcome to ejemplo site.

Modificadores del operador de sustitución

Los modificadores del operador de sustitución se muestran en la siguiente tabla:

ModificadorDescripción
iSi se añade "i" al modificador, la expresión regular dejará de ser sensible a mayúsculas y minúsculas, es decir, "a" y "A" son iguales.
mDe forma predeterminada, el inicio "^" y el final "$" de la expresión regular se aplican solo a la cadena completa. Si se añade "m" al modificador, el inicio y el final se referirán a cada línea de la cadena: el comienzo de cada línea es "^" y el final es "$".
oLa expresión se ejecuta solo una vez.
sSi se añade "s" al modificador, el "." predeterminado, que representa cualquier carácter excepto el salto de línea, se convertirá en cualquier carácter, es decir, incluyendo el salto de línea.
xSi se añade este modificador, los caracteres de espacio en blanco en la expresión se ignorarán, a menos que hayan sido escapados.
gReemplaza todas las cadenas coincidentes.
eLa cadena de reemplazo se evalúa como una expresión.

Operador de transliteración

Los siguientes son los modificadores relacionados con el operador de transliteración:

ModificadorDescripción
cTranslitera todos los caracteres no especificados
dElimina todos los caracteres especificados
sComprime múltiples caracteres de salida idénticos en uno solo

El siguiente ejemplo convierte todas las letras minúsculas de la variable $string en mayúsculas:

Ejemplo

#!/usr/bin/perl $string = 'welcome to ejemplo site.'; $string =~ tr/a-z/A-Z/; print "$string\n";

Al ejecutar el programa anterior, el resultado es:

WELCOME TO EJEMPLO SITE.

El siguiente ejemplo usa /s para eliminar los caracteres repetidos de la variable $string:

Ejemplo

#!/usr/bin/perl $string = 'ejemplo'; $string =~ tr/a-z/a-z/s; print "$string\n";

Al ejecutar el programa anterior, el resultado es:

runob

Más ejemplos:

$string =~ tr/\d/ /c;     # 把所有非数字字符替换为空格
$string =~ tr/\t //d;     # 删除tab和空格
$string =~ tr/0-9/ /cs    # 把数字间的其它字符替换为一个空格。

Más reglas de expresiones regulares

Expresión Descripción
. Coincide con todos los caracteres excepto el salto de línea
x? Coincide con la cadena x 0 o 1 vez
x* Coincide con la cadena x 0 o más veces, pero con el menor número de coincidencias posible
x+ Coincide con la cadena x 1 o más veces, pero con el menor número de coincidencias posible
.* Coincide con cualquier carácter 0 o más veces
.+ Coincide con cualquier carácter 1 o más veces
{m} Coincide exactamente con m ocurrencias de la cadena especificada
{m,n}Coincide con entre m y n ocurrencias de la cadena especificada
{m,} Coincide con m o más ocurrencias de la cadena especificada
[] Coincide con los caracteres que están dentro de []
[^]Coincide con los caracteres que no están dentro de []
[0-9]Coincide con todos los caracteres de dígitos
[a-z] Coincide con todos los caracteres de letras minúsculas
[^0-9] Coincide con todos los caracteres que no son dígitos
[^a-z]Coincide con todos los caracteres que no son letras minúsculas
^ Coincide con el carácter al comienzo de la cadena
$Coincide con el carácter al final de la cadena
\d Coincide con un carácter de dígito, igual que la sintaxis [0-9]
\d+ Coincide con uno o más dígitos, igual que la sintaxis [0-9]+
\D No dígito, por lo demás igual que \d
\D+ No dígitos, por lo demás igual que \d+
\w Cadena de letras, dígitos o guion bajo, igual que la sintaxis [a-zA-Z0-9_]
\w+ Igual que la sintaxis [a-zA-Z0-9_]+
\W Cadena que no es letra ni dígito, igual que la sintaxis [^a-zA-Z0-9_]
\W+ Igual que la sintaxis [^a-zA-Z0-9_]+
\s Espacio en blanco, igual que la sintaxis [\n\t\r\f]
\s+ Igual que [\n\t\r\f]+
\S No espacio en blanco, igual que la sintaxis [^\n\t\r\f]
\S+ Igual que la sintaxis [^\n\t\r\f]+
\b Coincide con cadenas que tienen límites de letras o dígitos
\B Coincide con cadenas que no tienen límites de letras o dígitos
a|b|c Coincide con cadenas que contienen el carácter a, o el carácter b, o el carácter c
abcCoincide con cadenas que contienen abc (pattern) () Este símbolo recuerda las cadenas encontradas; es una sintaxis muy práctica. La cadena encontrada dentro del primer () se convierte en la variable $1 o \1; la del segundo () se convierte en $2 o \2, y así sucesivamente.
/pattern/i i Este parámetro indica ignorar las mayúsculas y minúsculas del inglés, es decir, al hacer coincidir cadenas, no se consideran las diferencias de mayúsculas y minúsculas. \ Si desea buscar un carácter especial, como "*", dentro del patrón pattern, debe añadir el símbolo \ delante de este carácter para que el carácter especial pierda su efecto.

Más referencias

Expresiones regulares:https://www.example.com/regexp/regexp-tutorial.html

Expresiones regulares de Perl:https://perldoc.perl.org/perlre#Regular-Expressions

Otras extensiones