Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Ayuda con expresiones regulares

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Sab Abr 05, 2008 9:02 pm
stargate
Perlero Nuevo
Perlero Nuevo
Registrado: 05 Abr 2008
Mensajes: 5
Ayuda con expresiones regulares Responder citando

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:

Perl:
my $cant=1;
$_="hola mundo hola";

/(.*?)\smundo\s\1(?{print "casa";$cant++;})/;


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.
Mensaje Sab Abr 05, 2008 9:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

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

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

Código:
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.

Ultima edición por explorer el Sab Abr 05, 2008 9:39 pm, editado 1 vez
Mensaje Sab Abr 05, 2008 9:31 pm
stargate
Perlero Nuevo
Perlero Nuevo
Registrado: 05 Abr 2008
Mensajes: 5
Responder citando

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í:

Perl:
/(.*?)\smundo\s\1(?{print "casa";$cant++;})/;


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:

Perl:
$_"hola mundo holahola mundo hola";
/((.*?)\smundo\s\1(?{print "casa";$cant++;}))*/;
Mensaje Sab Abr 05, 2008 9:38 pm
stargate
Perlero Nuevo
Perlero Nuevo
Registrado: 05 Abr 2008
Mensajes: 5
Responder citando

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.
Mensaje Sab Abr 05, 2008 9:58 pm
stargate
Perlero Nuevo
Perlero Nuevo
Registrado: 05 Abr 2008
Mensajes: 5
Responder citando

digamos que tengo esto :

Perl:
$_"a\na\na\nb\nb\n";


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

Ultima edición por stargate el Lun Abr 07, 2008 7:59 am, editado 1 vez
Mensaje Dom Abr 06, 2008 5:41 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

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

bash:
perl -le '$_ = "a\na\na\nb\nb\n"; $a = tr/a/a/; $b = tr/b/b/; print "$a\n$b"'

(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?
Mensaje Dom Abr 06, 2008 7:30 am
stargate
Perlero Nuevo
Perlero Nuevo
Registrado: 05 Abr 2008
Mensajes: 5
Responder citando

Creo que es necesario hacerlo con una sola expr. regular porque en el ejemplo anterior
Perl:
'$_ = "a\na\na\nb\nb\n";

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.
Mensaje Dom Abr 06, 2008 10:29 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Bueno, pues los contaremos a lo bruto:

bash:
perl -le '$_ = "a\na\na\nb\nb\n"; for (split //) { $visto{$_}++ if /\w/ } for (sort keys %visto) { print "$_ $visto{$_}" }'
a 3
b 2
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group