Expresiones Regulares en Perl

LoginLogin     BuscarBuscar   RegistrarseRegistrarse  PerfilPerfil   Ver M. privadosMsg. privados   MiembrosMiembros   Grupos de UsuariosGrupos Usuarios   FAQFAQ

Expresiones Regulares en Perl

 
   
Expresiones Regulares en Perl  


Agregar esta página a tu escritorioAgr. Escritorio
Agregar a tus favoritosAgr. Favoritos
Enviar esta página a tus amigosEnviar Amigo
Imprimir esta PáginaImprimir


Google

Expresiones Regulares en Perl
 
Publicar nuevo temaResponder al tema
   Foros de discusión -> Perl / CGI
Ver tema anterior :: Ver tema siguiente  
Mensaje
Asunto: Expresiones Regulares en Perl       Mensaje Publicado: Sab Dic 10, 2005 5:53 pm Responder citando
 
 
Una expresión regular (regex) es una forma general de describir un patrón o máscara de caracteres que queremos buscar en un string.

Las expresiones regulares que se pueden construir. Premite expresar cualquier tipo de sintaxis para una cadena de caracteres.

Estas,se construyen en base a los patrones, el patrón se escribe entre barras de dividir (//). Y u uso principal es para buscar y también para sustituir.

Operadores
Perl define dos operadores especiales (=~ y !~) que permiten testear si un patrón aparece dentro de un String:

$resultado = $var =~ /abc/;

El valor que toma $resultado puede ser:

True, si se encuentra el patrón en el String
False, si no se encuentra

En el ejemplo, $resultado tendrá valor cierto o fálso, según la cadena "abc" esté contenida en $var.

Suponiendo que $var="Pepe Alvarez", el $resultado sería falso
Suponiendo que $var="abcdefghijk", el $resultado sería cierto


El operador !~ es justo la negación de =~

$result = $var !~ /abc/;


En este caso buscaríamos resultados que no contuviesen "abc".
Estamos en el contrario del caso anterior.

Cuando los utilizamos junto con otros operadores en una fórmula. Los operadores =~ y !~ tienen mayor preferencia que los de multiplicar y dividir, pero menor que la exponenciación (**).

Perl da soporte a un amplio conjunto de carateres patron con un significado especial dentro de una regexp, los cuales suelen utilizarse a menudo

El Carácter +
El símbolo + significa "una o más ocurrencias del carácter precedente".

Por ejemplo, la regexp $result = $var !~ /de+f/ devuelve true con los siguientes valores de $var:

def, deef, deeef, deeeeeeef

Una utilidad evidente, es utilizar el símbolo + para frases separadas por cualquier número de espacios. Ejemplo, junto con la instrucción split, que genera un array a partir de un caracter divisor del string original. suponer el string:

$linea = “Esto es un String”;

Si utilizamos:

@palabras = split (/ /, $linea);


Obtenemos un array con el siguiente contenido:

@palabras = (“Esto”, “es”, “”, “un”, “”, “”, “String”);


Podemos corregir esta situación haciendo:

@palabras = split (/ +/, $linea);


Y en este caso, el resultado mas correcto, sería.

@palabras = (“Esto”, “es”, “un”, “String”);

Los Caracteres []
Los corchetes sirven para definir patrones que ofrecen alternativas. Por ejemplo, la siguiente regexp sirve para buscar def o dEf:

/d[eE]f/


Se pueden especificar tantas alternativas como se desee:

/a[0123456789]c/


Esta regexp busca la letra “a”, después un dígito seguido por una “c”. Se pueden combinar los corchetes con el símbolo +, por ejemplo:

/d[eE]+f/


Esto nos permite hacer match en los siguientes strings:

def, dEf, deef, dEef, dEEEeeeEef


Cuando el carácter ^ aparece en la primera posición depués de [, indica que el patron debe hacer match de cualquier carácter excepto los que se indican entre corchetes. Por ejemplo, el patrón

/d[^eE]f/


Hace match si:

El primer carácter es una “d”.
El segundo carácter es cualquier cosa excepto la “e” o la “E”.
El último carácter es una “f”.
Los caracteres * ? {}
Su funcionamiento es similar al del símbolo +, con la única diferencia de la multiplicidad de la búsqueda realizada.



El carácter * busca cero o más ocurrencias del carácter precedente. Por ejemplo, la regexp

/de*f/
Hace match sobre los strings

df, def, deef, deeeeeef


El carácter ? busca cero o una ocurrencia del carácter precedente. Por ejemplo, la regexp

/de?f/
Hace match sobre

df, def
Sin embargo, no lo hace sobre “deef”, porque la “e” aparece dos veces.



Perl nos permite especificar el número de ocurrencias de un patrón, para lo cual utilizaremos las llaves {}. Entre las llaves especificamos dos números separados por “,”; el primero es el número de veces mínima que debe aparecer, y el segundo el número de veces máxima. Por ejemplo,

/de{1,3}f/
Hace match de una “d”, seguido de una, dos o tres ocurrencias de la “e” y finalmente una “f”. Para especificar un número exacto de ocurrencias, se pone un único número entre las llaves. Ejemplo:

/de{3}f/
Este patrón solo hace match sobre el string “deeef”.

Para especificar un mínimo de ocurrencias, dejamos en blanco el segundo número. Por ejemplo:

/de{3,}f/
Esta regexp busca una “d”, seguida de al menos 3 “e” y finalmente una “f”.

Similarmente, para esecificar un número de ocurrencias máximo pero no mínimo hacemos:

/de{0,3}f/
Este ejemplo hace martch de una “d”, seguido de no más de 3 “e” y una “f”.

El Carácter .
El punto (.) sirve para hacer match de cualquier carácter excepto el de retorno de carro. Por ejemplo, la regexp

/d.f/
Busca una “d”, seguido de cualquier carácter (excepto \n) y finalmente una “f”.

El carácter (.) se usa frecuentemente en combinación con el *. Por ejemplo, la siguiente regexp hace match de cualquier string que contenga en carácter “d” antes de la “f”:

/d.*f/
El Carácter |
El carácter especial | nos permite especificar dos o más alternativas. Por ejemplo,

/def|ghi/
Busca tanto “def” como “ghi”.

Otro ejemplo:

/[a-z]+|[0-9]+/
Hace match de una o más letras minúsculas o de uno o más dígitos.

Secuencias de escape
Si deseamos incluir en nuestra regexp un carácter especial de los vistos hasta ahora, o de los que más adelante serán mostrados, hay que ponerle precedido de la barra invertida (backslash) “\” Por ejemplo, para buscar si un string tiene uno o más asteriscos, haremos:

/\*+/
Para incluir un backslash en un patron, hay que poner dos backslashes:

/\\+/
Otra posibilidad es encerrar los caracteres especiales entre los comandos \Q y \E. Por ejemplo, la regexp

/\Q^ab*\E/
busca cualquier ocurrencia del string “^ab*”, mientras que

/\Q^ab\E*/
busca el string “^a” seguido de cero o más ocurrencias del carácter “b”

Hacer Match de Letras o Números
El siguiente patrón sirve para buscar un dígito

/[0123456789]/
Otra forma de escribir lo mismo es lo siguiente:

/[0-9]/
Similarmente, el rango [a-z] busca cualquier letra minúscula, y el rango [A-Z] hace match sobre cualquier letra mayúscula. Por ejemplo, la regexp

/[A-Z][A-Z]/
busca dos letras mayúsculas consecutivas

Para hacer match de cualquier letra mayúscula o minúscula o de un dígito, utilizaremos:

/[0-9a-zA-Z]/
Los Anchors ^ $
Sirven para asegurar que el patrón se busca solamente al comienzo o al final del string. Por ejemplo, la regexp

/^def/
Busca “def” sólo si son los tres primeros caracteres en el String. Similarmente, el patrón

/def$/
Hace match de “def” solo si son los tres últimos caracteres en el string. Se pueden combinar ambos operadores para hacer match del string completo, por ejemplo

/^def$/
Es cierto si y solo si el string es “def”.

Las secuencias de escape \A y \Z son equivalentes a ^ y $, respectivamente

Los Anchors de Palabras
Los anchors, \b y \B, especifican si un patrón debe coincidir con un límite de una palabra o debe estar dentro de la misma. (Un límite de una palabra es el comienzo o el final de la misma). Se consideran como caracteres que pueden formar una palabra las letras, los dígitos y el carácter subrayado (_). Los demás se toman como separadores de palabras.



El código \b especifica que el patrón debe estar en el límite de la palabra. Por ejemplo, la regexp

/\bdef/
Hace match solo si “def” está en el comienzo de la palabra. Por tanto, son válidos tanto “def” como “defghi”, pero “abcdef” no lo es.

También se puede emplear \b para indicar el final de una palabra. Por ejemplo,

/def\b/
Hace match sobre “def” y “abcdef”, pero no sobre “defghi”. Finalmente, la regexp

/\bdef\b/
Busca únicamente la ocurrencia de la palabra “def”.

El código \B es el opuesto de \b. \B hace match solo si el patrón está contenido en una palabra. Por ejemplo, la regexp

/\Bdef/
Hace match sobre “abcdef”, pero no sobre “def”.


Sustitución de variables en patrones
Se puede utilizar el valor de una variable escalar dentro de una regexp. Por ejemplo, el siguiente código divide el contenido de $linea en palabras:

$patron = "[\\t ]+";
@palabras = split(/$patron/, $linea);
Rangos de caracteres
Existen ciertos rangos de caracteres que aparecen frecuentemente en Perl, y para los que existe definida una secuencia de escape. Por ejemplo,

/[0-9]/
Es equivalente a

/\d/
En la siguiente tabla se listan las secuencias de escape para rangos de caracteres más utilizadas:

Secuencia de escape
Descripción
Rango

\d
Cualquier dígito
[0-9]

\D
Cualquier carácter que no sea un dígito
[^0-9]

\w
Cualquier carácter de palabras
[_0-9a-zA-Z]

\W
Negación del anterior
[^_0-9a-zA-Z]

\s
Espacio en blanco, tabulador, retorno de carro
[ \r\t\n\f]

\S
Negación del anterior
[^ \r\t\n\f]



Reuso de porciones de patrones
Suponer que deseamos hacer match de lo siguiente:

Uno o más dígitos o letras minúsculas.
Seguido de dos puntos o punto y coma.
Seguido de otro grupo de uno o más dígitos o letras minúsculas.
Seguido de dos puntos o punto y coma.
Y otro grupo de uno o más dígitos o letras minúsculas.
Una forma de hacer esto sería la siguiente:

/[\da-z]+[:;][\da-z]+[:;][\da-z]+/
Sin embargo, Perl proporciona una forma más fácil de especificar patrones repetitivos, y consiste en encerrar la parte que deseemos entre paréntesis:

([\da-z]+)
Perl guarda la sequencia que hemos puesto entre paréntesis en memoria, y nos podemos referirnos a ellas utilizando la sintaxis \num, don de num es un número entero que representa el orden (comenzando en 1) del patrón.

Así, el patrón anterior queda de la siguiente forma:

/([\da-z]+])[:;]\1[:;]\1/
También se puede almacenar el [:;]. quedando

/([\da-z]+)([:;])\1\2\1/

Extraer substrings de una regexp
Una vez fuera de la expresión, podemos extraer las partes que nos interesan, para lo cual Perl proporciona una serie de variables en las cuales almacena los valores que coinciden con las expresiones de la regexp encerradas entre paréntesis.

Por ejemplo,

$string = "Un string con un número: 25.11.";
$string =~ /-?(\d+)\.?(\d+)/;
$integer_part = $1;
$decimal_part = $2;

Los valores $1, $2, etc. se borran cuando se ejecuta otra regexp. Existe otra variable especial, $& que contiene el match completo. Podemos hacer, por tanto:


$string = "Un string con un número: 25.11.";
$string =~ /-?(\d+)\.?(\d+)/;
$number = $&;

Precedencia de los caracteres especiales
Perl define reglas de precedencia para determinar el orden de ejecución. Por ejemplo, la regexp

/x|y+/
Hace match de o bien “x” o bien una o más ocurrencias de y, ya que el operador + es más prioritario que el operador |.



La precedencias se resumen en la siguiente tabla, de mayor a menor



Carácter
Descripción

()
Memoria de match

+ * ? {}
Número de ocurrencias

^ $ \b \B
Anchors

|
Alternativas



Especificar un delimitador de patrón
Podemos determinar que el separador de regexp sea un carácter diferente a la barra de dividir.

/de*f/
Si deseamos utilizar la exclamación, podemos hacer

m!de*f!
De esta forma se minimiza el efecto “diente de sierra” que surje al combinar las barras / y \.

Opciones de match
Podemos especificar unas opciones adicionales para determinar como se va a realizar la búsqueda del patron en el string. Se resumen en la siguiente tabla.

Opción
Descripción

g
Match todas las posibles ocurrencias

i
Insensible a mayúsculas y minúsculas

m
Trata un string con multiples líneas

s
Trata un string como una única línea

x
Ignora los espacios en blanco en la regexp


Operador g
El operador “g” dice a Perl que haga match sobre todas las posibles ocurrencias en el String. Por ejemplo:

$str = “patata”;
$str =~ /.a/g;
Hace match de “pa”, “ta” y “ta”. Si asignamos el resultado a un array, obtenemos todos los match que se han realizado. Por tanto,

@matches = $str =~ /.a/g;
Hace que @matches contenga:

("pa", "ta", "ta")
Operador i
La opción “i” nos habilita para hacer búsquedas case-insensitive. Por ejemplo, el siguiente patrón hace match de “de”, “dE”, “De”, “DE”.


/de/i

Operador m
Esta opción le dice al intérprete de Perl que el String contiene multiples líneas de texto. Con este operador, si se pone el carácter especial ^, se busca bien al principio del string o al principio de cada línea. Por ejemplo,

/^Un/m
Hace match en

Este patron tiene\nUn par de líneas
Igualmente, el carácter $ busca al final del string y al final de cada línea.

Opción s
Hace que el string sea tratado como una única línea de texto, y obliga a que el carácter (.) incluya el carácter de retorno de carro.

Operador x
Si la regexp es muy compleja, podemos decir a Perl que ignore los espacios en blanco que pongamos en ella con el objeto de clarificar su contenido. Por ejemplo,

/\d{2}([\W])\d{2}\1\d{2}/
Es equivalente a:

/\d{2} ([\W]) \d{2} \1 \d{2}/x

Si se necesita un espacio en blanco, se puede hacer escape con la barra \.

El operador de sustitución
Perl permite reemplazar una parte de un string por otra, apoyándose en las expresiones regulares. La sintaxis es la siguiente:

s/pattern/replacement/
El intérprete de Perlbusca por el patron especificado, y si lo encuentra lo reeemplaza por lo que hayamos especificado en la segunda parte del operador. Por ejemplo:

$string = "abc123def";
$string =~ s/123/456/;
Aquí, 123 es reeemplazado por 456, por lo que $string vale ahora “abc456def”.

Podemos utilizar expresiones como las vistas anteriormente, p.e.

s/[abc]+/0/
Busca una secuencia consistente en una o más ocurrencias de las letras a, b, y c (en cualquier orden) y reemplaza dicha secuencio por el valor “0”. Si lo que queremos es borrarla, en lugar de reeemplazarla, haríamos:

s/abc//

Variables
En la parte de reemplazar, se pueden utilizar variables que se refiere a la parte del string sobre la que se ha hecho match. Por ejemplo:

s/(\d+),(\d+)/$2,$1/
Esta regexp busca la ocurrencia de uno o más dígitos. Al estar encerrado entre paréntesis, se almacena en la variable escalar $1 y $2, que se pueden utilizar en la parte de reemplazado. Podemos hacer los siguiente:

$numeros = “123,456”;
$numeros =~ s/(\d+),(\d+)/$2,$1/;
Ahora $numeros vale “456,123”;



Para la sustitución se pueden emplear los mismos operadores que vimos con anterioridad, más el operador “e”.

Operador e
La opción “e” trata el string de reemplazado como una expresión que debe ejecutar. Por ejemplo, consideremos lo siguiente:

$string = "F-12";
$string =~ s/(\d+)/$1*2/e;

La segunda parte de la expresión de sustitución se ejecuta al establecer la opción “e”, por tanto, la variable $string queda finalmente con “F-24”.



El operador de traslación
Existe una alternativa para sustituir un grupo de caracteres por otro: el operador tr. Tiene la siguiente sintaxis:

tr/string1/string2/

Aquí, string1 contiene una lista de caracteres a ser reemplazados, y string2 contiene los caracteres que los sustituyen. El primer carácter en string1 es reemplazado por el primero en string2, y así sucesivamente. Ejemplo:

$string = "abcdefghicba";
$string =~ tr/abc/def/;
Y hace lo siguiente:

Todas las ocurrencias de “a” se cambian por “d”.
Todas las ocurrencias de “b” se cambian por “e”.
Todas las ocurrencias de “c” se cambian por “f”.


Al final, $string tiene el valor “defdefghifed”.
 
Orcos Master
Invitado


Volver arriba
Mostrar mensajes de anteriores:   
Publicar nuevo temaResponder al tema
   Foros de discusión -> Perl / CGI Todas las horas son GMT
 
Página 1 de 1
 
Cambiar a:  
Puede publicar nuevos temas   -   No puede responder a temas   -   No puede editar sus mensajes   -   No puede borrar sus mensajes   -   No puede votar en encuestas   -  
 


 
Foros, Índice e Inicio de los forums  
Informe de Abuso, sugerencia o Error en esta página
Navegue hasta la página erronea, y pinche
Quiero ser Moderador
Quiero Sujerir un Foro

Forotopía, no se hace responsable de los comentarios y post de los miembros de este foro. No tiene ningún típo de vinculación con los autores o moderadores, mas que las de su filiación. Estando estos sujetos a las condiciones de utilización de este sitio.

Si usted cree que los contenidos datos u opiniones vulneran o lesionan algún derecho particular propio o de un tercero. Por favor alértenos con un aviso de abuso. Muchas gracias por su interés y colaboración. Enlaces

© Hector Fernández Pereda -- Europe -- Spain -- Asturias   @Email
Administrador