• Publicidad

Búsqueda en variable, utilizando expresiones regulares

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Búsqueda en variable, utilizando expresiones regulares

Notapor Pablo3728 » 2010-03-26 09:13 @426

Buenas, tengo una consulta respecto al siguiente ejercicio: tengo una variable completa (llamada línea) de la forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
....La prueba...... , ...... La prueba ....\n ..., ......
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como se muestra en el ejemplo mi variable contiene varias veces la frase que comienza con "La prueba " y termina en "," existiendo la posibilidad de que hayan saltos de línea entre medio. La idea es intentar de adquirir todas las frases que comienzan con "La prueba " y terminan en "," pero utilizando expresiones regulares. El código que más o menos he manejado es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($linea =~ /(La prueba [^,]*,)/g)
    print $1;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Sin embargo solo me lee la primera aparición de la frase que quiero y ahí termina el programa. Si alguien tendría alguna idea sería muy bueno. Desde ya gracias :)
Pablo3728
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2010-03-26 08:33 @398

Publicidad

Re: Búsqueda en variable, utilizando expresiones regulares

Notapor explorer » 2010-03-26 10:19 @471

Bienvenido a los foros de Perl en Español, Pablo3728.

En lugar de if(), debes usar while(): quieres hacer un bucle por todas las apariciones.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Búsqueda en variable, utilizando expresiones regulares

Notapor erv-Z » 2010-03-26 10:27 @477

Bueno, cuando vas a usar el operador /g, necesitarás usar una sentencia infinita, en este caso while(), ya que tendrás que capturar lo mismo valores en la misma cadena, pero el if(), al capturar el primer valor se termina la expresión, en cambio while() se sigue ejecutando...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. $linea = "....La prueba...... , ...... La prueba ....\n ..., .....";
  4.  
  5. $linea =~ s/\n?//g; # Eliminamos el \n
  6. while($linea =~ m/[\s|.]?La\s?prueba([\w\.\s]+)[,]/ig){
  7.     print "[$1]\n";
  8. }
  9. exit; # Finalizamos el script
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y la salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[...... ]
[ .... ...]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La expresión regular:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. [\s|.]?La\s?prueba([\w\.\s]+)[,]/ig
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[\s|.]?La\s?prueba
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Puede existir algún espacio o punto antes de La prueba
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
([\w\.\s]+)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Capturamos los los carácter Alfa-numéricos, puntos, y espacios... Usamos los corchete de agrupación...
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[,]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y recordamos que la captura termina antes de la coma.

Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Búsqueda en variable, utilizando expresiones regulares

Notapor Pablo3728 » 2010-03-26 12:04 @544

Bueno, ¡muchísimas gracias! funcionó perfecto. ¡Seguiremos en contacto!
Pablo3728
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2010-03-26 08:33 @398

Re: Búsqueda en variable, utilizando expresiones regulares

Notapor explorer » 2010-03-26 19:51 @868

Esta solución también te vale, además de respetarte a los finales de línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $texto = "jeje..La prueba...jajaja... , .jijiji.. La prueba .jojojo...\n  jujuju..., .final..";

while ($texto =~ m/La prueba(.*?),/gs) {

    print "[$1]\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[...jajaja... ]
[ .jojojo...
  jujuju...]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La expresión regular busca, de forma repetida (/g) por la cadena de $texto, teniendo en cuenta que tiene caracteres de fin de línea (/s). Y lo que busca es "La prueba", seguido del menor número de caracteres posibles, que capturamos ((.*?)), antes de la siguiente ','.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron