miércoles, 28 de noviembre de 2012

Expresiones Regulares | ¿Como lee mi navegador una direccion email o numero de teléfono?

Cuando tecleamos en nuestro navegador web una direccion email, un numero de teléfono, un numero de cuenta,o cualquier otro dato, nos podemos preguntar, ¿como lo hace? ¿que hay mas abajo de lo que estoy viendo?
Pues la respuesta es muy interesante, si tecleamos un numero de telefono se está usando una expresion regular para reconocerlo.

Por ejemplo si tecleo el telefono 999666333, ¿que expresion regular se ha encargado de reconocerlo?
Pues esta: \d{9}.
Es muy sencilla, \d es una expresion regular que acepta un solo digito y con {9} permitimos que sean nueve digitos.
¿Que pasa si tecleo el tecleo el telefono de otra forma, por ejemplo 666 333 o 66 63 33?
Pues la expresion regular \d{9} ya no nos vale porque es demasiado restrictiva y tenemos que modificarla para que acepte una u otra forma de teclear el numero de telefono.

Vamos a ir a primero a modificar la expresion regular para aceptar el formato sin prefijo 666 333:
Queda de la forma: (\d{3} )(\d{3}).
Aqui (\d{3} ) es la E.R. que reconoce el primer campo, 666 (terminado en espacio en blanco).
Y (\d{3}) es la que reconoce el segundo campo, 333.
Es decir hemos formado una expresion regular juntando dos expresiones regulaes y la unica diferencia entre una y otra es que la de la izquierda acepta un espacio en blanco y la segunda no.

Ahora le llega el turno al formato 66 63 33:
Pues la expresion regular tiene que aceptar tres campos de dos numeros y ademas los dos primeros campos tienen espacio en blanco.
Hmm, bueno ¿si tengo tres campos de dos numeros entonces tengo que juntar tres expresiones regulares que acepten solo dos numeros?
Tic tac... ¡Correcto!
Pues la expresion regular es esta: (\d{2} ){2}(\d{2}).

La cosa se pone interesante cuando nos preguntamos: ¿pero todo el mundo no memoriza  los numeros de telefono de la misma forma asi que si yo introduzco en el navegador mi numero de telefono puede que no me lo reconozca solo por el formato en el que yo lo suelo escribir?
No hay problema, usamos un O logico (simbolo |).
Asi que la expresion resultante es: ((\d{3} )(\d{3})|(\d{2} ){2}(\d{2}))
Vale, es mas grande pero solo son las dos E.R. anteriores juntadas y se le añaden parentesis de prioridad al igual que en la multiplicacion, si como en la E.S.O.

Vamos a ser excepticos, hoy en dia hay que teclear siempre el prefijo, pues ¡vamos a por el!
Si hemos estado atentos y teniendo en cuenta que un prefijo es un numero de tres cifras entonces la expresion regular para el prefijo es esta: (\d{3} ).

Y por fin ya podemos aceptar numeros con prefijo y tecleando de una forma o de otra con:
 (\d{3} )((\d{3} )(\d{3})|(\d{2} ){2}(\d{2}))

Como podemos ver las expresiones regulares es lo que los ordenadores usan para almacenar datos como numeros telefonicos, nombres y apellidos, direcciones de correo, numeros de cuenta, etc..
Antes de terminar se deja como curiosidad la expresion regular necesaria para reconocer direcciones de correo, se complica algo mas: \w[\w.%+-]*@(\w[\w-]*\.)+[a-zA-Z]{2,6}.
Ala, ahora a ver que significa cada cosa...

Podeis ampliar mas informacion pinchando aqui:
http://www.regular-expressions.info/characters.html

Y aqui para poner a prueba las expresiones regulares que se os ocurran:
http://www.regexplanet.com/advanced/java/index.html

No hay comentarios:

Publicar un comentario