• Publicidad

Construir la expresión regular correcta

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

Construir la expresión regular correcta

Notapor rookie23 » 2006-02-03 14:07 @629

Saludos a todos en el foro.

Tengo un problema... tengo que validar que en una tabla no existan direcciones incorrectas, principalmente en el numero de la casa. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Numero exterior    Status
  4                            ok
  5b                          ok
  7bis                       ok
  104                        ok
  8interior                 INCORRECTO
  74 alfrente             INCORRECTO
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Los dos últimos registros están incorrectos en el campo Numero exterior, los primeros cuatro casos están bien. Vaya, cualquier caso que salga del patrón de los primeros cuatro registros será incorrecto.

¿Cómo quedaría construida mi expresión regular? Agradezco cualquier ayuda.

Hasta luego.
rookie23
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-01-12 12:46 @573

Publicidad

Re: Construir la expresión regular correcta

Notapor explorer » 2006-02-03 14:24 @641

Si nos ajustamos al ejemplo, una posible expresión regular sería esta:

print "$linea Ok\n" if $linea =~ /^\d+(b(is)?)?/;

Es decir, buscamos que la $linea empieza (^) por un dígito (\d) o más (+), seguido quizás (?) por la letra b que a su vez puede (?) estar seguida por las letras is.

Pero bueno... se puede hacer de otras maneras... ¿Alguien más se apunta?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor rookie23 » 2006-02-03 14:36 @650

Mil gracias por la respuesta.

La verdad es que he tratado de encontrar documentación acerca de la construcción de Expresiones Regulares, si hay, pero no abundan mucho en el tema, solo dan los principios básicos.

Solo una aclaración: la validación que se necesita implica que los números exteriores: empiecen con un número, que puede ser seguido por una sola letra o por la palabra 'bis', todo lo que salga de este patrón será incorrecto.

Mil gracias por las sugerencias... Hasta luego.
rookie23
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-01-12 12:46 @573

Re: Construir la expresión regular correcta

Notapor explorer » 2006-02-03 15:02 @668

rookie23 escribiste:Mil gracias por la respuesta, la verdad es que he tratado de encontrar documentación acerca de la construcción de Expresiones Regulares, si hay, pero no abundan mucho en el tema, solo dan los principios básicos.
Bueno, tutoriales hay algunos y en la raíz de esta web hay algunos.

rookie23 escribiste:Solo una aclaración, la validación que se necesita implica que los números exteriores: empiecen con un número, que puede ser seguido por una sola letra o por la palabra 'bis', todo lo que salga de este patrón será incorrecto.
Tu mismo has descrito la expresión regular:

print "$linea Ok\n" if $linea =~ /^\d+(\w|bis)?\b/;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor rookie23 » 2006-02-03 15:27 @685

Mil disculpas por molestar tanto... Pero la verdad es que ya he hecho varias pruebas y no me funciona y estoy super atorado con esto.

El chiste es que por ejemplo la cadena "89asjfb" me la marque como incorrecta ya que después del dígito solo debo admitir una sola letra. Por ejemplo, "89a" eso sería correcto, peeeero las cadenas que contengan 'bis', por ejemplo, "34bis" sean correctas. Les paso el script completo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. print "Escriba una cadena :";
  3. $cadena=<STDIN>;
  4. #if ($cadena!~/1(a-z)\z/)   intento fallido
  5. #if ($cadena =~ /^\d\D?/)   intento fallido
  6. if ($cadena =~ /^\d+\w?/)
  7. {print "Cadena correcta \n";}
  8. else
  9. {print "Cadena INcorrecta \n";}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

y al ejecutar el script

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. [cau@localhost ejemplos]$ perl letras.pl
  2. Escriba una cadena :8lakf
  3. Cadena Correcta
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mil gracias y disculpen por moler tanto... Saludos.
rookie23
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-01-12 12:46 @573

Re: Construir la expresión regular correcta

Notapor explorer » 2006-02-03 15:40 @694

Prueba esto
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. print "Escriba una cadena :";
  3. $cadena=<STDIN>;
  4. if ( $cadena =~ /^\d+([a-z]|bis)?$/ ) {
  5.     print "Cadena correcta \n"
  6. } else {
  7.     print "Cadena INcorrecta \n";
  8. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La expresión regular queda así: Comienza (^) por un número (\d+) y es seguido (quizás ?) inmediatamente por una letra ([a-z]) o (|) por la palabra bis y nada más ($).

El problema está ahora en indicar que sólo queremos una letra ( o el 'bis'). Por eso ponemos el metacarácter '$' para decir que ahí debe terminar la cadena.

Si hay algo más, entonces no es válida.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor rookie23 » 2006-02-03 17:49 @784

¡¡ Muchas gracias, explorer !!

Es increíble la cantidad de variantes que puedes presentar este tipo de expresiones, así es, la expresión es correcta, funciona perfectamente. Una última pregunta, en el siguiente código me hace falta quitar el espacio al inicio de la cadena, pero no logro colocar el metacarácter adecuado para que borre el espacio al inicio.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Escriba una cadena :";
  2. $cadena=<STDIN>;
  3. if ($cadena=~m/^\s/)
  4. { print " ¡¡¡    hay un espacio al pricipio  !!!";
  5.   $cadena=~s/^\s/___ ;    <-
  6. }
  7. else
  8. { print "Correcto ";}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias por su ayuda. Saludos.
rookie23
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2006-01-12 12:46 @573

Notapor kidd » 2006-02-03 19:32 @855

Hola.

Voy a meter mis pares de centavos, ¡je,je! En primer lugar yo haría un pequeño cambio en la exp. reg. que recomendó explorer:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. print "Escriba una cadena :";
  4.  
  5. $cadena=<STDIN>;
  6.  
  7. if ( $cadena =~ /^\d+(?:[a-z]|bis)?$/ ) {
  8.     print "Cadena correcta \n"
  9. }
  10. else {
  11.     print "Cadena INcorrecta \n";
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Al poner el ?: al principio del paréntesis evitas la sobrecarga ocasionada pues Perl guarda lo que captura dentro de los paréntesis en la variable especial $1. En este caso no se nota mucho, pero es buena práctica.

Ahora con tu siguiente problema, puedes hacer lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "Escriba una cadena :";
  2.  
  3. $cadena=<STDIN>;
  4.  
  5. if ($cadena =~ s/^\s+//) {
  6.     print "Ye hemos quitado el espacio del principio";
  7. }
  8. else {
  9.     print "Correcto ";
  10. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Básico

¿Quién está conectado?

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