Sab Abr 05, 2008 9:02 pm
|
 |
stargate
Perlero Nuevo

|
Registrado: 05 Abr 2008
Mensajes: 5
|
|
| Ayuda con expresiones regulares |
|
|
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. |
|
|
|

Sab Abr 05, 2008 9:17 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
|
|
|
|
|
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 |
|

Sab Abr 05, 2008 9:31 pm
|
 |
stargate
Perlero Nuevo

|
Registrado: 05 Abr 2008
Mensajes: 5
|
|
|
|
|
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++; }))*/; |
|
|
Sab Abr 05, 2008 9:38 pm
|
 |
stargate
Perlero Nuevo

|
Registrado: 05 Abr 2008
Mensajes: 5
|
|
|
|
|
| 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. |
|
Dom Abr 06, 2008 5:41 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
|
|
|
|
Powered by phpBB © 2001, 2005 phpBB Group
|