• Publicidad

Problema con expresión regular

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

Re: Problema con expresión regular

Notapor explorer » 2011-08-12 06:43 @322

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 & 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

Publicidad

Re: Problema con expresión regular

Notapor pvaldes » 2011-08-12 10:40 @486

> 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...
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Anterior

Volver a Programación en general

¿Quién está conectado?

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