[C con Clase] Expresiones Regulares en C

Programante programante en gmail.com
Sab Dic 19 16:26:31 CET 2009


Kalith escribió:
> aqui la version corregida en ansi C
>
> int scanner(char* word){
>
> unsigned int i = 0, aux = 0, pos, dot = 0;
>
> for (;i < strlen(word); ++i){
>
> if(!dot && !aux && i > 0 && word[i] == '@') ++aux, pos = i;
>
> if(!dot && aux && word[i] == '.' && (i - pos > 1)) ++aux, dot = 1;
>
> if(dot && (strlen(word) - i > 2)) return 1;
> }
>
> return 0;
> }
>
> y mi version en c++ mas corta que hace lo mismo testie todos los
> posibles casos y creo que esta bastante bien..
>
> bool scanner(string word){
>
> bool ret = false;
>
> size_t pa = word.find('@'), pd = word.find('.');
>
> if(pa != string::npos && pd != string::npos){
>
> if(pa > 0 && (pd - pa > 1) && (word.size() - pd > 2))
> ret = true;
> }
>
> return ret;
> }
No son iguales.
La segunda acepta "foo.bar en com"; y la primera no.
Lo arreglas cambiando la línea a
size_t pa = word.find('@'), pd = word.find('.', pa);

Por otro lado, las llamadas a strlen en la primera versión le dan un
rendimiento cuadrático.
Cambia i < strlen(word) a word[i] en la guarda del bucle.
Puedes mejorar un poco la condición if(strlen(word) - i > 2)
escribiéndola como if(strlen(word + i) > 2)
pero en realidad no necesitas usar la variable dot, ya que lo que haces
es mirar la longitud nada más encontrar el punto.
Te quedaría:

int scanner3(char* word){

unsigned int i, aux = 0, pos;

for (i=0; word[i]; ++i){
  if (!aux && i > 0 && word[i] == '@') ++aux, pos = i;

  if(aux && word[i] == '.' && (i - pos > 1)) {
        ++aux;
        if(strlen(word+i) > 2)
            return 1;
        else
            return 0;
    }
}

return 0;
}





Más información sobre la lista de distribución Cconclase