• Publicidad

Problema con expresión regular

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

Problema con expresión regular

Notapor BigBear » 2017-04-01 20:00 @875

Hola, este es el texto que estoy extrayendo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
:Doddy!~Doddy@blablabla PRIVMSG ClapTrap :texto enviado
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Este es el código del cual necesito extraer el texto enviado que es el que está al final, al lado del último ":". Por alguna razón no puedo extraerlo porque me devuelve cadena vacía...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $log =~/:(.*)!(.*) PRIVMSG (.*) :(.*)/ ) {
  2.    my $user = $1;
  3.    my $message = $4;
  4. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¿ Cuál es el problema ?

P.D.: Ahora, por una razón misteriosa, el foro me cambia una parte de la expresión regular por el enlace del emoticono :sad:, :evil: :twisted: :evil:
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Problema con expresión regular

Notapor explorer » 2017-04-02 09:31 @438

Pues no lo sé, porque a mí sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E 'q(:Doddy!~Doddy@blablabla PRIVMSG ClapTrap :texto enviado) =~ /:(.*)!(.*) PRIVMSG (.*) :(.*)/; say "[$1][$4]"'
  2. [Doddy][texto enviado]
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que puedes hacer es ejecutarlo bajo el módulo re, con la opción 'debug', y así te muestra el análisis que hace el motor de expresiones regulares:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
perl -Mre=debug -E 'q(:Doddy!~Doddy@blablabla PRIVMSG ClapTrap :texto enviado) =~ /:(.*)!(.*) PRIVMSG (.*) :(.*)/; say "[$1][$4]"'                                                                                                      
Compiling REx ":(.*)!(.*) PRIVMSG (.*) :(.*)"
Final program:
   1: EXACT <:> (3)
   3: OPEN1 (5)
   5:   STAR (7)
   6:     REG_ANY (0)
   7: CLOSE1 (9)
   9: EXACT <!> (11)
  11: OPEN2 (13)
  13:   STAR (15)
  14:     REG_ANY (0)
  15: CLOSE2 (17)
  17: EXACT < PRIVMSG > (21)
  21: OPEN3 (23)
  23:   STAR (25)
  24:     REG_ANY (0)
  25: CLOSE3 (27)
  27: EXACT < :> (29)
  29: OPEN4 (31)
  31:   STAR (33)
  32:     REG_ANY (0)
  33: CLOSE4 (35)
  35: END (0)
anchored ":" at 0 floating " PRIVMSG " at 2..9223372036854775807 (checking floating) minlen 13
Matching REx ":(.*)!(.*) PRIVMSG (.*) :(.*)" against ":Doddy!~Doddy@blablabla PRIVMSG ClapTrap :texto enviado"
Intuit: trying to determine minimum start position...
  doing 'check' fbm scan, [2..53] gave 23
  Found floating substr " PRIVMSG " at offset 23 (rx_origin now 0)...
  doing 'other' fbm scan, [0..22] gave 0
  Found anchored substr ":" at offset 0 (rx_origin now 0)...
  (multiline anchor test skipped)
Intuit: Successfully guessed: match at offset 0
   0 <> <:Doddy!~Do>         |   0| 1:EXACT <:>(3)
   1 <:> <Doddy!~Dod>        |   0| 3:OPEN1(5)
   1 <:> <Doddy!~Dod>        |   0| 5:STAR(7)
                             |   0| REG_ANY can match 54 times out of 2147483647...
   6 <Doddy> <!~Doddy@bl>    |   1|  7:CLOSE1(9)
   6 <Doddy> <!~Doddy@bl>    |   1|  9:EXACT <!>(11)
   7 <oddy!> <~Doddy@bla>    |   1|  11:OPEN2(13)
   7 <oddy!> <~Doddy@bla>    |   1|  13:STAR(15)
                             |   1|  REG_ANY can match 48 times out of 2147483647...
  47 <texto> < enviado>      |   2|   15:CLOSE2(17)
  47 <texto> < enviado>      |   2|   17:EXACT < PRIVMSG >(21)
                             |   2|   failed...
  40 <pTrap> < :texto en>    |   2|   15:CLOSE2(17)
  40 <pTrap> < :texto en>    |   2|   17:EXACT < PRIVMSG >(21)
                             |   2|   failed...
  31 <IVMSG> < ClapTrap >    |   2|   15:CLOSE2(17)
  31 <IVMSG> < ClapTrap >    |   2|   17:EXACT < PRIVMSG >(21)
                             |   2|   failed...
  23 <labla> < PRIVMSG C>    |   2|   15:CLOSE2(17)
  23 <labla> < PRIVMSG C>    |   2|   17:EXACT < PRIVMSG >(21)
  32 <VMSG > <ClapTrap :>    |   2|   21:OPEN3(23)
  32 <VMSG > <ClapTrap :>    |   2|   23:STAR(25)
                             |   2|   REG_ANY can match 23 times out of 2147483647...
  47 <texto> < enviado>      |   3|    25:CLOSE3(27)
  47 <texto> < enviado>      |   3|    27:EXACT < :>(29)
                             |   3|    failed...
  40 <pTrap> < :texto en>    |   3|    25:CLOSE3(27)
  40 <pTrap> < :texto en>    |   3|    27:EXACT < :>(29)
  42 <rap :> <texto envi>    |   3|    29:OPEN4(31)
  42 <rap :> <texto envi>    |   3|    31:STAR(33)
                             |   3|    REG_ANY can match 13 times out of 2147483647...
  55 <exto enviado> <>       |   4|     33:CLOSE4(35)
  55 <exto enviado> <>       |   4|     35:END(0)
Match successful!
[Doddy][texto enviado]
Freeing REx: ":(.*)!(.*) PRIVMSG (.*) :(.*)"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y sobre el "misterio" de los emoticones... Por defecto, estos foros intentan representar cualquier subcadena que encuentren, del tipo ':(' o ':)' y demás, a gráficos de emoticones. Pero claro, en Perl, es probable encontrar esos textos, como te ha pasado a ti, en la exp. regular.

La solución está, en el momento de editar el mensaje, debajo de la caja de texto de edición, hay una pestaña de Opciones, en las cuales hay una que debes activar: Deshabilitar emoticones (como he hecho yo con este mismo mensaje).

Prueba con esta otra expresión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -E 'q(:Doddy!~Doddy@blablabla PRIVMSG ClapTrap :texto enviado) =~ /^:(.+?)!.+ PRIVMSG .+:(.+)$/; say "[$1][$2]"'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Problema con expresión regular

Notapor BigBear » 2017-04-02 14:02 @626

Sí, es raro, tu expresión regular funciona bien en mi código, creo que la línea tendrá espacios raros. Gracias por la ayuda, explorer.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Problema con expresión regular

Notapor BigBear » 2017-04-02 18:44 @822

De nuevo, solo un detalle: en tu última expresión regular, cuando leo el mensaje final y uso "http://" recibo solo "//" como resultado, ¿por qué pasa eso? Intenté usando "(.*)" directamente pero es igual.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Problema con expresión regular

Notapor explorer » 2017-04-03 07:41 @362

El carácter ':' está haciendo de las suyas.

Usa esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
/^:(.+?)!.+ PRIVMSG .+ :(.+)$/
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

(hay un espacio en blanco más)
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: Problema con expresión regular

Notapor BigBear » 2017-04-03 16:11 @716

Ahora sí reconoce todo. Gracias por la ayuda, explorer.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron