[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

LANG=es_ES y expresiones regulares.



Estoy usando Potato 2.2r3

Las expresiones regulares en mi sistema parecen estar funcionando
muy mal para los rangos de letras mayúsculas y minúsculas. 

Hago una prueba desde egrep y .. ALUCINO.  


egrep '[A-Z]'<<FIN
A
B
C
Y
Z
a
b
c
y
z
0
1
FIN

		A
		B
		C
		Y
		Z
		b
		c
		y
		z

Las letras minúsculas no deberían salir. Curiosamente la 'a' minuscula
no sale y las restantes si, pero no queda en esto la cosa.

egrep '[a-z]'<<FIN
A
B
C
Y
Z
a
b
c
y
z
0
1
FIN

		A
		B
		C
		Y
		a
		b
		c
		y
		z

Ahora no deberían haber salido las mayúsculas pero la única mayúscula
que no sale es la 'Z' y las restantes si.

En realidad otro tipo de pruebas muestran todo tipo de resultados
absurdos.

Acabo de comprobar que esto pasa con LANG=es_ES

En cambio con LANG=es el comportamiento es totalmente correcto.

Dado que las expresiones regulares se usan en un montón de programas
me gustaría saber como una cosa así puede estar pasando. Una cosa
así puede causar un destrozo enorme en los datos de cualquier sistema.

Estoy usando LANG=es_ES yo creo que desde hace más de un año y claro
si alguna vez se ha obtenido algún resultado erroneo, me pasó 
desapercibido. 

'egrep' no es el único afectado. Cualquier programa que use expresiones
regulares se ve afectado y para demostralo he realizado un programa de
prueba en c.


============8<------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <libintl.h>
#include <regex.h>
char cadaux[300];

int EvalRegExpReg(char *Patron, char *Cad){
regex_t preg;
int cod1, cod2;

  cod1=regcomp(&preg, Patron, REG_EXTENDED);
  if (cod1!=0){
  	cod2=regerror(cod1, &preg, cadaux, sizeof(cadaux));
	fprintf(stderr, "Error '%s' compilando patrón '%s'\n", 
			cadaux, Patron);	
	return cod1;
  }
  cod1=regexec(&preg, Cad, 0, NULL,  0);
  if (cod1!=0){
  	cod2=regerror(cod1, &preg, cadaux, sizeof(cadaux));
	fprintf(stderr, "ExpresionRegular='%s', Cadena='%s'\n", Patron, Cad);	
	fprintf(stderr, "Resultado= '%s'\n", cadaux);	
  }
  regfree(&preg);
  return cod1;
}


	  
main(int argc, char **argv){
	setlocale(LC_ALL, "");
	if (argc!=3){
		fprintf(stderr, "Uso:\nregexpr <patron> <cadena>\n");
		exit (-1);
	}
	exit (EvalRegExpReg( argv[1], argv[2]));
}

============8<------------------------------------------------------


Si esto es un Bug me parece gordísimo. 

Si no lo es,  necesito que algún alma caritativa me aclare las ideas.



Un saludo

Antonio Castro

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
        /\     /\      Ciberdroide Informática (Tienda de Linux)
          \\W//            <<< http://www.ciberdroide.com >>>
	 _|0 0|_                                                    
+-oOOO--(___o___)--OOOo----------------------------------------------------+ 
|  . . . . U U . . . . Antonio Castro Snurmacher  acastro@ciberdroide.com  |  
|  . . . . . . . . . .                                                     | 
+()()()----------()()()----------------------------------------------------+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** |
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>>            |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+




Reply to: