validar email o dirección de correo con Pattern y Matcher

Iniciado por kinos, 3 Agosto 2009, 19:46 PM

0 Miembros y 1 Visitante están viendo este tema.

kinos

La expresión regular para validar un email entero es: (comento que puede que no sea del todo correcta)

"[a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*@[a-z0-9][\\w\\.-]*[a-z0-9]\\.[a-z][a-z\\.]*[a-z]$"

Esta puede tener algún fallo: "[a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*@[a-zA-Z0-9_]+[.[a-zA-Z]+]+"

También esta otra: [a-zA-Z0-9][a-zA-Z0-9_-]+[\\p{Punct}[a-zA-Z0-9_-]+]*@[a-zA-Z0-9_]+[\\{Punct}[a-zA-Z]+]+


También hay dos metodos para validar por separado, uno para la parte izquierda del email y otro para la derecha derecha del email.


Código (java) [Seleccionar]


import java.util.regex.*;
import java.util.StringTokenizer;

public class Main {

   public boolean validateEmail(String email) {
       
       Pattern p = Pattern.compile("[a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*@[a-z0-9][\\w\\.-]*[a-z0-9]\\.[a-z][a-z\\.]*[a-z]$");//me gusta esta
       
       Matcher m = p.matcher(email);
       return m.matches();
   }

   public boolean validateLeftEmail(String emailLeft) {
       Pattern p = Pattern.compile("[a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*");
       Matcher m = p.matcher(emailLeft);
       return m.matches();
   }

   public boolean validateRightEmail(String emailRight) {
       Pattern p = Pattern.compile("[a-z0-9][\\w\\.-]*[a-z0-9]\\.[a-z][a-z\\.]*[a-z]$");
       Matcher m = p.matcher(emailRight);
       return m.matches();

   }

   public static void main(String[] args) {
       Main miMain = new Main();
       System.out.println("*****************************validateEmail******************************************");
       System.out.println("email: " + "example@cs.uns.edu.ar " + miMain.validateEmail("example@cs.uns.edu.ar"));
       System.out.println("email: " + "name-surname@computer_name.net_name.com " + miMain.validateEmail("name-surname@computer_name.net_name.com"));
       System.out.println("email: " + "name-sur#name@computer_name.net_name.com " + miMain.validateEmail("name-sur#name@computer_name.net_name.com"));
       System.out.println("email: " + "name-surname@comp#uter_name.net_name.com " + miMain.validateEmail("name-surname@comp#uter_name.net_name.com"));
       System.out.println("email: " + "name-surname@computer_name.net_na#me.com " + miMain.validateEmail("name-surname@computer_name.net_na#me.com"));
       System.out.println("email: " + "!u@hotm@ail.co " + miMain.validateEmail("!u@hotm@ail.co"));
       System.out.println("email: " + "u@hotm@ail.co " + miMain.validateEmail("u@hotm@ail.co"));
       System.out.println("email: " + "u@hotmail.co " + miMain.validateEmail("u@hotmail.co"));
       System.out.println("email: " + "u@hotmail.c " + miMain.validateEmail("u@hotmail.c"));
       System.out.println("email: " + "!u@hotmail.cc " + miMain.validateEmail("!u@hotmail.cc"));
       System.out.println("email: " + "uu@hotmail.cc " + miMain.validateEmail("uu@hotmail.cc"));
       System.out.println("email: " + "@hotmail.cc " + miMain.validateEmail("@hotmail.cc"));
       System.out.println("email: " + ".u@hotmail.cc " + miMain.validateEmail(".u@hotmail.cc"));
       System.out.println("email: " + "u.u@hotmail.cc " + miMain.validateEmail("u.u@hotmail.cc"));
       System.out.println("email: " + "u u@hotmail.cc " + miMain.validateEmail("u u@hotmail.cc"));
       System.out.println("email: " + "uu@h.cc " + miMain.validateEmail("uu@h.cc"));
       System.out.println("email: " + "5u@h.cc " + miMain.validateEmail("5u@h.cc"));
       System.out.println("email: " + "uu@hh.cc " + miMain.validateEmail("uu@hh.cc"));
       System.out.println("email: " + "5uu@hh.cc " + miMain.validateEmail("5uu@hh.cc"));
       System.out.println("email: " + "5uu@h.cc " + miMain.validateEmail("5uu@h.cc"));
       System.out.println("email: " + "5.cc " + miMain.validateEmail("5.cc"));
       System.out.println("email: " + "5@h.cc " + miMain.validateEmail("5@h.cc"));
       System.out.println("email: " + "5@h.cc.d " + miMain.validateEmail("5@h.cc.d"));
       System.out.println("email: " + "5@h.cc.dd " + miMain.validateEmail("5@h.cc.dd"));
       System.out.println("email: " + "5@h.c.dd " + miMain.validateEmail("5@h.c.dd"));
       System.out.println("email: " + "avf-@h.c.dd " + miMain.validateEmail("avf-@h.c.dd"));
       System.out.println("email: " + "a-vf@h.c.dd " + miMain.validateEmail("a-vf@h.c.dd"));
       System.out.println("email: " + "avf@h.c.dd " + miMain.validateEmail("avf@h.c.dd"));
       System.out.println("email: " + "-avf@h.c.dd " + miMain.validateEmail("-avf@h.c.dd"));
       System.out.println("email: " + "_avf@h.c.dd " + miMain.validateEmail("_avf@h.c.dd"));
       System.out.println("email: " + "a-_-_.-_b--d__-@h.c.dd " + miMain.validateEmail("a-_-_.-_b--d__-@h.c.dd"));
       System.out.println("email: " + "a_._-@h.c.dd " + miMain.validateEmail("a_._-@h.c.dd"));
       System.out.println("email: " + "a_.-@h.c.dd " + miMain.validateEmail("a_.-@h.c.dd"));
       System.out.println("email: " + "a.-@h.c.dd " + miMain.validateEmail("a.-@h.c.dd"));

       System.out.println("*****************************validateRightEmail******************************************");
       System.out.println("email: " + "cs.uns.edu.ar " + miMain.validateRightEmail("cs.uns.edu.ar"));
       System.out.println("email: " + "computer_name.net_name.com " + miMain.validateRightEmail("computer_name.net_name.com"));
       System.out.println("email: " + "comp#uter_name.net_name.com " + miMain.validateRightEmail("comp#uter_name.net_name.com"));
       System.out.println("email: " + "computer_name.net_na#me.com " + miMain.validateRightEmail("computer_name.net_na#me.com"));
       System.out.println("email: " + "hotm@ail.co " + miMain.validateRightEmail("hotm@ail.co"));
       System.out.println("email: " + "hotmail.co " + miMain.validateRightEmail("hotmail.co"));
       System.out.println("email: " + "hotmail.c " + miMain.validateRightEmail("hotmail.c"));
       System.out.println("email: " + "h.cc " + miMain.validateRightEmail("h.cc"));
       System.out.println("email: " + "hh.cc " + miMain.validateRightEmail("hh.cc"));
       System.out.println("email: " + "5.cc " + miMain.validateRightEmail("5.cc"));
       System.out.println("email: " + "h.cc.d " + miMain.validateRightEmail("h.cc.d"));
       System.out.println("email: " + "h.cc.dd " + miMain.validateRightEmail("h.cc.dd"));
       System.out.println("email: " + "h.c.dd " + miMain.validateRightEmail("h.c.dd"));
       System.out.println("email: " + "ail.co " + miMain.validateRightEmail("ail.co"));
       System.out.println("email: " + "hotm@ail.co " + miMain.validateRightEmail("hotm@ail.co"));
       System.out.println("email: " + "hotm " + miMain.validateRightEmail("hotm"));
       System.out.println("email: " + "hotmail.co " + miMain.validateRightEmail("hotmail.co"));
       System.out.println("email: " + "hotmail.c " + miMain.validateRightEmail("hotmail.c"));
       System.out.println("email: " + "hotmail.cc " + miMain.validateRightEmail("hotmail.cc"));
       System.out.println("email: " + "h.cc " + miMain.validateRightEmail("h.cc"));
       System.out.println("email: " + "5.cc " + miMain.validateRightEmail("5.cc"));
       System.out.println("email: " + "h.cc.d " + miMain.validateRightEmail("h.cc.d"));
       System.out.println("email: " + "h.cc.dd " + miMain.validateRightEmail("h.cc.dd"));
       System.out.println("email: " + "5h.c.dd " + miMain.validateRightEmail("5h.c.dd"));

       System.out.println("*****************************validateLeftEmail******************************************");
       System.out.println("email: " + "!u@hotm " + miMain.validateLeftEmail("!u"));
       System.out.println("email: " + "u " + miMain.validateLeftEmail("u"));
       System.out.println("email: " + "uu " + miMain.validateLeftEmail("uu"));
       System.out.println("email: " + "!u " + miMain.validateLeftEmail("!u"));
       System.out.println("email: " + ".u " + miMain.validateLeftEmail(".u"));
       System.out.println("email: " + "u.u " + miMain.validateLeftEmail("u.u"));
       System.out.println("email: " + "u u " + miMain.validateLeftEmail("u u"));
       System.out.println("email: " + "5u " + miMain.validateLeftEmail("5u"));
       System.out.println("email: " + "5.cc " + miMain.validateLeftEmail("5.cc"));
       System.out.println("email: " + "5 " + miMain.validateLeftEmail("5"));
       System.out.println("email: " + "avf- " + miMain.validateLeftEmail("avf-"));
       System.out.println("email: " + "a-vf " + miMain.validateLeftEmail("a-vf"));
       System.out.println("email: " + "avf " + miMain.validateLeftEmail("avf"));
       System.out.println("email: " + "-avf " + miMain.validateLeftEmail("-avf"));
       System.out.println("email: " + "_avf " + miMain.validateLeftEmail("_avf"));
       System.out.println("email: " + "a-_-_.-_b--d__- " + miMain.validateLeftEmail("a-_-_.-_b--d__-"));
       System.out.println("email: " + "a_._- " + miMain.validateLeftEmail("a_._-"));
       System.out.println("email: " + "a_.- " + miMain.validateLeftEmail("a_.-"));
       System.out.println("email: " + "a.- " + miMain.validateLeftEmail("a.-"));
   }
}


Danther

¿Y la expresion regular no seria mas bien:
"[a-zA-Z0-9]+[a-zA-Z0-9_-]*@[a-zA-Z]+\\p{Punct}[a-zA-Z]+"

Es que no le veo la logica a la que has puesto T.T
Prueba con esta, a mi me va bien
Si le falta algo se lo añades y si le sobra se lo quitas (es que tampoco se muy bien cuales son los caracteres permitidos en una direccion de email XD)

Debci

que se supone que quiere decir:
"[a-zA-Z0-9]+[a-zA-Z0-9_-]*@[a-zA-Z]+\\p{Punct}[a-zA-Z]+"  :huh:
perdonad mi ignorancia, y tambienq ue significa y para que sirve el patern y el compile.

saludos

kinos

#3
Hola Danther en la que has puesto me parece que faltaría el "." de la parte de la izquierda. Y lo que dices de los caracteres permitidos igual habría que revisarlo.
Esta expresión \\p{Punct} no se mu bien que significa.

Debci explico  :) :=> [a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*@[a-zA-Z0-9_]+[.[a-zA-Z]+]+

[a-zA-Z0-9]+ => valida las cadenas que contienen al menos un caracter de esos tres rangos es igual el orden de los caracteres y tal. El + quiere decir eso, que al menos tiene que haber un caracter, sino no la da por buena.

[a-zA-Z0-9_-]+ => lo mismo que el anterior pero esta cadena puede contener guión y guión bajo

[.[a-zA-Z0-9_-]+]* => el punto signf. cualquier carácter. El asterisco quiere decir que todo ese bloque es o no es... jeje esa es la cuestión. Quiero decir que o aparece o no.
Por ejemplo:

- si tienes sólo ".d" es valido
- si tienes sólo "." no es valido porque como hemos dicho el "+" significa que tiene que haber al menos un caracter.
- si tienes sólo "" es decir cadena vacia es valido

@ => luego va la arroba y lo siguiente mas de lo mismo.

Lo de Pattern es para establecer un patrón, y el compile para compilar la cadena respecto a dicho patrón. Bueno para que te hagas una idea que tampoco controlo el tema.

Alguna referencia:

http://www.programacion.com/java/articulo/expresionesreg/

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

Iré probando a ver que tal va, sino cambiamos la expresión.

Danther

Un "." no quiere decir .
Sino cualquier caracter
\\p{Punct} es "."

Por lo tanto [a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*
Significa:

"uno o mas de [a-zA-Z0-9]" y luego "ninguno o mas de: cualquier caracter seguido de uno o mas [a-zA-Z0-9_-]"

Asi que para que quede bien seria:

[a-zA-Z0-9][a-zA-Z0-9_-]+[\\p{Punct}[a-zA-Z0-9_-]+]*@[a-zA-Z0-9_]+[\\Punct[a-zA-Z]+]+

Pruebala ahora, creo que cumple con lo que quieres
Mirate que antes no podias poner _ ni - en la parte izquierda hasta el primer "punto", ahora mientras - o _ no sean el primer caracter, si se puede poner antes del primer "punto"

kinos

mmm... sip me colao, ahora lo cambio. ahms... que el método validateRightEmail no esta bién del todo, ese hay que mirarlo que se cuelan cadenas así "hotm".

Danther

El problema estaba en esto:
[.[a-zA-Z0-9_-]+]*

No significa de 0 a x veces "punto y x caracteres"
Sino de 0 a x veces intervalo entre punto, a-z, A-Z, 0-9, _, -
Ademas \p{Punct] incluye muchos mas simbolos, es mejor \.

Prueba ahora con esta:

[a-zA-Z0-9][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)*@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+

juancho77

y si mi dirección esta en un subdominio? ej: example@cs.uns.edu.ar ? Creo que hay que revisar eso despues del arroba (digo creo, porque lo lei medio apurado).

kinos

Cita de: juancho77 en  4 Agosto 2009, 07:38 AM
y si mi dirección esta en un subdominio? ej: example@cs.uns.edu.ar ? Creo que hay que revisar eso despues del arroba (digo creo, porque lo lei medio apurado).

Pues no la da por valida...  :(

Danther

#9
[a-zA-Z0-9][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)*@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+

Esta si  --^--^   -->-->