• Publicidad

Ayuda con 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.

Ayuda con expresiones regulares

Notapor stargate » 2008-04-05 22:02 @959

Hola, por favor, si alguien me puede ayudar con esto lo agradecería mucho.

Lo que quiero hacer es incrementar una variable o imprimir algo solo si la expresión regular me reconoce un patrón. Ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $cant=1;
$_="hola mundo hola";

/(.*?)\smundo\s\1(?{print "casa";$cant++;})/;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Probé con eso pero no me anda, o sea, que solo si me reconoce "hola mundo hola" me imprima "casa" y me incremente $cant, pero no me funciona,
¿cómo lo puedo hacer?

Gracias.
stargate
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2008-04-05 21:07 @921

Publicidad

Notapor explorer » 2008-04-05 22:17 @970

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

Pues el caso es que a mí sí que me funciona:

Código: Seleccionar todo
explorer@portatil:~/Documents/Desarrollo> perl -le '$_="hola mundo hola";$cant=1;/(.*?)\smundo\s\1(?{print "casa";$cant++;})/;print $cant'
casa
2


Actualización: Humm... me parece que ya entiendo el problema... El caso es cómo construir la expresión regular para que detecte dos palabras iguales alrededor de la palabra 'mundo'. Es algo complicado, porque falta más información, pero una primera solución puede ser sustituyendo el '(.*?)' por un '(\w+)'. Es decir, en vez de capturar cualquier cosa, intentamos capturar una palabra entera.

Pero esto no garantiza que capturemos una palabra entera que coincida con la segunda. Por ejemplo, $_="hol mundo hola"; pasaría el test, ya que la primera palabra está incluida en la segunda.
Última edición por explorer el 2008-04-05 22:39 @985, editado 1 vez en total
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

Notapor stargate » 2008-04-05 22:31 @980

Amigo explorer, muchas gracias por responder, pero el problema que tengo es que quiero imprimir e incrementar dentro de la expresión regular (dentro de //), o sea , hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
/(.*?)\smundo\s\1(?{print "casa";$cant++;})/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y que después del último paréntesis yo pueda seguir reconociendo otro patrón o comprobar el mismo si esta duplicado y pueda contar todas las veces que está duplicado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$_"hola mundo holahola mundo hola";
/((.*?)\smundo\s\1(?{print "casa";$cant++;}))*/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
stargate
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2008-04-05 21:07 @921

Notapor stargate » 2008-04-05 22:38 @985

Vaya, ¿ sí te funciona ?, qué extraño que a mi no, ¿ y cuál sería la función del signo "?" aquí : (?{print "casa";$cant++;})? que haga lo que está entre "{" y "}" solo si reconoce este patrón (.*?)\smundo\s\1.
stargate
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2008-04-05 21:07 @921

Notapor stargate » 2008-04-05 22:58 @999

digamos que tengo esto :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$_"a\na\na\nb\nb\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y quiero contar la cantidad de a's y de b's que tengo, la unica opcion es hacerlo con una expresion de este estilo : no?

esto imprimiria;
3
2
Última edición por stargate el 2008-04-07 08:59 @416, editado 1 vez en total
stargate
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2008-04-05 21:07 @921

Notapor explorer » 2008-04-06 06:41 @320

Yo creo que te estás complicando un poco...

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le '$_ = "a\na\na\nb\nb\n"; $a = tr/a/a/; $b = tr/b/b/; print "$a\n$b"'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

(Sacado de perlfaq4, How can I count the number of occurrences of a substring within a string?)

¿O es imprescindible hacerlo todo con solo una expresión regular?
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

Notapor stargate » 2008-04-06 08:30 @395

Creo que es necesario hacerlo con una sola expr. regular porque en el ejemplo anterior
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'$_ = "a\na\na\nb\nb\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

yo quiero contar los caracteres repetidos pero yo no sé qué caracteres son, o sea, yo no sé si son 'a', 'b', u otro carácter.

explorer, muchas gracias por tus respuestas y tu tiempo.
stargate
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2008-04-05 21:07 @921

Notapor explorer » 2008-04-06 11:29 @520

Bueno, pues los contaremos a lo bruto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -le '$_ = "a\na\na\nb\nb\n"; for (split //) { $visto{$_}++ if /\w/ } for (sort keys %visto) { print "$_ $visto{$_}" }'
a 3
b 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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

cron