Página 1 de 2

Problema con expresión regular

NotaPublicado: 2011-08-11 09:35 @441
por adrian_sla
¡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!

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 10:37 @484
por explorer
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.

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 11:07 @505
por pvaldes
mmmh ¿no escapas el |?

\|

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 11:12 @508
por explorer
No hace falta. Está dentro de una clase carácter ([...]).

¿No lo has probado?

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 12:57 @581
por adrian_sla
¡¡¡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!!!

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 13:37 @609
por explorer
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.

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 13:45 @614
por adrian_sla
¡¡¡Perfecta!!!

¡¡Anda bien!!

¡¡¡Muchísimas gracias!!!

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 15:17 @679
por adrian_sla
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!!!

Re: Problema con expresión regular

NotaPublicado: 2011-08-11 15:45 @697
por explorer
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

Re: Problema con expresión regular

NotaPublicado: 2011-08-12 05:47 @282
por pvaldes
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).