• Publicidad

Problema con expresión regular

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Problema con expresión regular

Notapor adrian_sla » 2011-08-11 09:35 @441

¡Hola!

Necesito hacer una expresión regular que solo deje pasar letras y |

Tengo que buscar por cosas así: aa|bbb|cc|ddd o eee
o sea, mínimo 2 letras, máximo 3 y puede o no venir un | pero no debe empezar ni terminar con |

¿Alguna sugerencia?

¡¡¡desde ya, muchas gracias!!!

¡Saludos!
adrian_sla
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-12-28 09:35 @441

Publicidad

Re: Problema con expresión regular

Notapor explorer » 2011-08-11 10:37 @484

En la expresión regular se ponen las condiciones indicadas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> perl -E '$_ = "aa|bbb|cc|ddd|eee"; say "SÍ" if /^[[:alpha:]][[:alpha:]|]+[[:alpha:]]$/'
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

En concreto, estamos diciendo que la cadena debe comenzar (^) por un carácter alfabético ([[::alpha]]), seguido por un conjunto de caracteres alfabéticos más el carácter '|' ([[:alpha:]|]+), y terminada ($), de nuevo, por otro carácter alfabético.
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

Re: Problema con expresión regular

Notapor pvaldes » 2011-08-11 11:07 @505

mmmh ¿no escapas el |?

\|
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Problema con expresión regular

Notapor explorer » 2011-08-11 11:12 @508

No hace falta. Está dentro de una clase carácter ([...]).

¿No lo has probado?
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

Re: Problema con expresión regular

Notapor adrian_sla » 2011-08-11 12:57 @581

¡¡¡Gracias por la ayuda!!!

La probé, pero creo que me faltaron datos para poder armarla.

Necesito que solo deje 2 o 3 letras. el | puede aparecer o no.

Por ejemplo, "aa", "bb|ccc" esas deben dar verdadero.

Pero si tengo "a" o "aa|b" o "aaaaa|bb" o "aa|bbbbb|cc", deben dar falso.

¿Serviría que a la expresión que pusiste antes, le agregue {2,3} para decir que solo 2 o 3 caracteres pueden ser emparejados?

Lo único es que no sé es dónde agregar eso...

¡¡¡Gracias!!!
adrian_sla
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-12-28 09:35 @441

Re: Problema con expresión regular

Notapor explorer » 2011-08-11 13:37 @609

Tienes razón, se me ha pasado. Y sí, la solución es poner {2,3}, pero entonces, la expresión regular anterior no te vale. Tal como está, si ponemos el cuantificador {2,3} podría darse el caso de admitir cadenas con más de 3 letras seguidas.

La siguiente sí que me funciona bien:

/^[[:alpha:]]{2,3}(?:[|][[:alpha:]]{2,3})*$/

que quiere decir que, al principio (^) esperamos por dos o tres caracteres alfabéticos, seguidos, hasta el final ($), por 0 o más veces (*) del conjunto formado por un carácter '|' y de una cadena de dos o tres caracteres alfabéticos.
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

Re: Problema con expresión regular

Notapor adrian_sla » 2011-08-11 13:45 @614

¡¡¡Perfecta!!!

¡¡Anda bien!!

¡¡¡Muchísimas gracias!!!
adrian_sla
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-12-28 09:35 @441

Re: Problema con expresión regular

Notapor adrian_sla » 2011-08-11 15:17 @679

Perdón que vuelva a molestar, pero necesito otra expresión, que acepte el mismo tipo de cadena que la anterior, pero además acepte números, como máximo 6, pudiendo no haber números.

O sea, la idea es que me pasan una cadena de caracteres separados por |.

Estos caracteres pueden ser, si son letras, como máximo 3 y mínimo 2. Si son números, máximo 6 (puede no haber números).

Ejemplos que deberían dar verdadero:
aa
aa|bb
aaa|bb|123456|ccc

Ejemplos que deberían dar falso:
a
aa|bbbb
aaa|b
aa|bbb|cc|1|d (daría falso por haber solo una "d")


Traté de modificar la expresión regular anterior pero me fue muy difícil :(

¡¡¡Desde ya, muchas gracias!!!
adrian_sla
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2010-12-28 09:35 @441

Re: Problema con expresión regular

Notapor explorer » 2011-08-11 15:45 @697

No lo he probado, pero debería ser así:

/^[[:alpha:]]{2,3}(?:[|](?:[[:alpha:]]{2,3}|[[:digit:]]{1,6}))*$/

Lo único que hemos hecho es agregar una alternativa: o letras o números.

Quizás queda más claro si ponemos espacios (con la ayuda de /x):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
/
    ^
    [[:alpha:]]{2,3}
    (?:
        [|]
        (?:
            [[:alpha:]]{2,3}
          | [[:digit:]]{1,6}
        )
    )*
    $
/x
Coloreado en 0.002 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con expresión regular

Notapor pvaldes » 2011-08-12 05:47 @282

Puedes buscar letras y números a la vez con \w, tendrías que añadirle el | y un indicativo del número de veces que quieres dar como aceptables. De todos modos, la diferente longitud de la cadena sugiere dividir el enfoque y analizarlos por separado, como ha hecho explorer, eso simplemente te simplificaría la expresión.

De todas maneras no acabo de entender la cadena que buscas, o mejor dicho la estructura de tu fichero, me pregunto si no te convendría simplificar primero el problema mediante un par de sustituciones.

Lo digo porque si esa cadena es un timestamp, o lo contiene, deberías plantearte usar los módulos enfocados a procesar tiempos y fechas.

¡Ah!, ojo al ? en la expresión (es importante no ser demasiado codiciosos).
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Siguiente

Volver a Programación en general

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado