Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Otros Temas » Programación en general » Problema con expresión regular Responder al tema
Nuevo tema


Página 1 de 1  [ 12 mensajes ] 
 
Nota 2011-08-11 09:35 @441

Perlero Nuevo
Registrado: 2010-12-28 09:35 @441
Mensajes: 15
Problema con expresión regular
¡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!


Nota 2011-08-11 10:37 @484
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema con expresión regular
En la expresión regular se ponen las condiciones indicadas:
Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> perl -E '$_ = "aa|bbb|cc|ddd|eee"; say "SÍ" if /^[[:alpha:]][[:alpha:]|]+[[:alpha:]]$/'

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


Nota 2011-08-11 11:07 @505

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Problema con expresión regular
mmmh ¿no escapas el |?

\|


Nota 2011-08-11 11:12 @508
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema con expresión regular
No hace falta. Está dentro de una clase carácter ([...]).

¿No lo has probado?

_________________
JF^D Perl programming


Nota 2011-08-11 12:57 @581

Perlero Nuevo
Registrado: 2010-12-28 09:35 @441
Mensajes: 15
Re: Problema con expresión regular
¡¡¡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!!!


Nota 2011-08-11 13:37 @609
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema con expresión regular
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


Nota 2011-08-11 13:45 @614

Perlero Nuevo
Registrado: 2010-12-28 09:35 @441
Mensajes: 15
Re: Problema con expresión regular
¡¡¡Perfecta!!!

¡¡Anda bien!!

¡¡¡Muchísimas gracias!!!


Nota 2011-08-11 15:17 @679

Perlero Nuevo
Registrado: 2010-12-28 09:35 @441
Mensajes: 15
Re: Problema con expresión regular
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!!!


Nota 2011-08-11 15:45 @697
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema con expresión regular
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):
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
/
    ^
    [[:alpha:]]{2,3}
    (?:
        [|]
        (?:
            [[:alpha:]]{2,3}
          | [[:digit:]]{1,6}
        )
    )*
    $
/x

_________________
JF^D Perl programming


Nota 2011-08-12 05:47 @282

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Problema con expresión regular
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).


Nota 2011-08-12 06:43 @322
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10270
Re: Problema con expresión regular
Una pequeña aclaración: el cuantificador '?' no es avaricioso. '*' sí que lo es. Y sí que nos interesa usarle en este caso, porque hay que validar toda la cadena.

Los '?' presentes en la expresión regular, tienen otra misión: marcan subpatrones extendidas (?: ... ), que sirven para agrupar patrones con paréntesis, pero sin que sean capturados.

_________________
JF^D Perl programming


Nota 2011-08-12 10:40 @486

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Problema con expresión regular
> el cuantificador '?' no es avaricioso

No hay que perder de vista que me expreso como un bobo a menudo :lol:, sobre todo cuando voy rápido y no verifico las cosas.

Lo que quiero enfatizar es que seguimos básicamente a ciegas sobre tu fichero de entrada y el tipo de cosas que buscas.

> 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).

o sea que la cadena:

11111|aa|aas|111111|5|bbb ¿es posible y aceptable para ti?

De hecho no has dicho en ningún momento que lo que buscas tenga que estar al principio de la línea, y por eso sugiero que no pierdas de vista el concepto del tratamiento avaricioso en la búsqueda de las expresiones, por ejemplo

aa|bbb|cc|1|d

Según el punto de vista que adoptes previamente esta cadena puede ser un resultado erróneo o bien 4 resultados válidos o bien 7 resultados aceptables

aa|bbb|cc
aa|bbb|cc|1
aa|bbb
aa|bb
bbb|cc|1
bbb|cc
bb|cc


Así que tienes que controlar ese tema, y eso implica ponerse a meditar sobre qué estás buscando realmente y saber aprovechar las peculiaridades y puntos fuertes de tu archivo de datos.

Probablemente no sería malo verificar a mano un pequeño fragmento de código y ver si se obtienen los mismos resultados que con el script.

Una alternativa.

Para cada línea:

@valor = split todo por |
next if int($x@valor) > 999999 (campo de más de 6 dígitos)

next if $x@valor tiene menos de dos caracteres y es letra
next if $x@valor tiene más de tres caracteres y es letra, o...
next if $x@valor tiene más de 6 caracteres

etc...


Responder al tema  [ 12 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO