Perl: uso de captura en expresiones regulares

Una expresión regular o regex es una string de caracteres que define el patrón que estamos viendo. Es una string especial que describe un patrón de búsqueda presente dentro de un texto dado.
Perl nos permite agrupar partes de estos patrones en un subpatrón y también recuerda la string que coincide con esos subpatrones. Este comportamiento se conoce como captura .

Es importante encontrar las coincidencias en la string y eso se hace mediante expresiones regulares (regex). Estas coincidencias son más útiles cuando las sacamos de las strings para su posterior procesamiento.

Perl hace que sea realmente fácil para nosotros extraer partes de una string que coincida usando paréntesis() alrededor de los datos en cualquier expresión regular. Perl postula esas coincidencias en variables especiales para cada conjunto de paréntesis de captura que son $1, $2, $3.

Ejemplo:

use warnings;
use strict;
  
# Using the localtime() function
# to get the local time
my $time = localtime(); 
  
print $time, "\n";
  
# Using regex to capture time data
# Accessing the captured match 
# using the special variable $1
print ("$1 \n") if($time =~ /(\d\d:\d\d:\d\d)/);

Capturas con nombre

Las capturas que nos permiten capturar porciones de coincidencias a partir de la aplicación de expresiones regulares y poder usarlas más tarde se conocen como capturas con nombre. Por ejemplo: Extraer un número de teléfono de una información de contacto.

La sintaxis básica para una captura numerada es:

(?<capture name> …)

Los paréntesis se utilizan para encerrar la captura. La construcción ?< nombre > se usa para seguir inmediatamente al paréntesis de apertura y proporcionar un nombre para esa captura en particular. El resto de la captura que queda fuera es una expresión regular.

Cuando hay un éxito de coincidencias con el patrón adjunto, Perl actualiza la variable mágica ‘ %+ ‘. Este hash contiene el nombre de la captura como clave y la parte de la string que coincidió con la captura como valor de hash. 
Las capturas con nombre a menudo mejoran la capacidad de mantenimiento de expresiones regulares. Aunque son posibles en Perl, no se usan con mucha frecuencia. Se usan solo en expresiones regulares de nivel superior.

Ejemplo:

# Extracting the parts of string
$_ = "The brown fox jumps over the lazy dog";
/the (\S+)(?{ $color = $^N }) (\S+)(?{ $animal = $^N })/i;
  
# Printing the matches
print "color = $color, animal = $animal\n"; 
Producción:

color = brown, animal = fox

Capturas numeradas

Las capturas numeradas no proporcionan ningún nombre de identificación ni hacen nada a %+. En cambio, en Perl, la string capturada se almacena dentro de una serie de variables mágicas. La primera captura coincidente se almacena en $1, la segunda en $2, y así sucesivamente. El recuento de capturas comienza en el paréntesis de apertura de la captura. Haciendo así que el primer paréntesis izquierdo capture en $1, el segundo en $2 y así sucesivamente.

La sintaxis de las capturas con nombre es más larga que la de las capturas numeradas y también proporciona una mayor claridad. La capacidad de mantenimiento de Regex es menor para las capturas numeradas. Las capturas numeradas son útiles en sustituciones simples donde la captura nombrada requeriría innecesariamente más cantidad de código.

Ejemplo:

# Extracting forename and surname
print "Please enter your name \n "; 
chop ($name = <'Vishal Raina '>);
  
if ($name =~ /^\s*(\S+)\s+(\S+)\s*$/) 
{
    print "Hi $1. Your Surname is $2.";
} 
else 
{
    print " Error";
}
print "\n";
Producción

Please enter your name 
Hi Vishal. Your Surname is Raina.

Publicación traducida automáticamente

Artículo escrito por vishalraina y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *