Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kinos en 3 Agosto 2009, 19:46 pm



Título: validar email o dirección de correo con Pattern y Matcher
Publicado por: kinos en 3 Agosto 2009, 19:46 pm
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
  1.  
  2. import java.util.regex.*;
  3. import java.util.StringTokenizer;
  4.  
  5. public class Main {
  6.  
  7.    public boolean validateEmail(String email) {
  8.  
  9.        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
  10.  
  11.        Matcher m = p.matcher(email);
  12.        return m.matches();
  13.    }
  14.  
  15.    public boolean validateLeftEmail(String emailLeft) {
  16.        Pattern p = Pattern.compile("[a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*");
  17.        Matcher m = p.matcher(emailLeft);
  18.        return m.matches();
  19.    }
  20.  
  21.    public boolean validateRightEmail(String emailRight) {
  22.        Pattern p = Pattern.compile("[a-z0-9][\\w\\.-]*[a-z0-9]\\.[a-z][a-z\\.]*[a-z]$");
  23.        Matcher m = p.matcher(emailRight);
  24.        return m.matches();
  25.  
  26.    }
  27.  
  28.    public static void main(String[] args) {
  29.        Main miMain = new Main();
  30.        System.out.println("*****************************validateEmail******************************************");
  31.        System.out.println("email: " + "example@cs.uns.edu.ar " + miMain.validateEmail("example@cs.uns.edu.ar"));
  32.        System.out.println("email: " + "name-surname@computer_name.net_name.com " + miMain.validateEmail("name-surname@computer_name.net_name.com"));
  33.        System.out.println("email: " + "name-sur#name@computer_name.net_name.com " + miMain.validateEmail("name-sur#name@computer_name.net_name.com"));
  34.        System.out.println("email: " + "name-surname@comp#uter_name.net_name.com " + miMain.validateEmail("name-surname@comp#uter_name.net_name.com"));
  35.        System.out.println("email: " + "name-surname@computer_name.net_na#me.com " + miMain.validateEmail("name-surname@computer_name.net_na#me.com"));
  36.        System.out.println("email: " + "!u@hotm@ail.co " + miMain.validateEmail("!u@hotm@ail.co"));
  37.        System.out.println("email: " + "u@hotm@ail.co " + miMain.validateEmail("u@hotm@ail.co"));
  38.        System.out.println("email: " + "u@hotmail.co " + miMain.validateEmail("u@hotmail.co"));
  39.        System.out.println("email: " + "u@hotmail.c " + miMain.validateEmail("u@hotmail.c"));
  40.        System.out.println("email: " + "!u@hotmail.cc " + miMain.validateEmail("!u@hotmail.cc"));
  41.        System.out.println("email: " + "uu@hotmail.cc " + miMain.validateEmail("uu@hotmail.cc"));
  42.        System.out.println("email: " + "@hotmail.cc " + miMain.validateEmail("@hotmail.cc"));
  43.        System.out.println("email: " + ".u@hotmail.cc " + miMain.validateEmail(".u@hotmail.cc"));
  44.        System.out.println("email: " + "u.u@hotmail.cc " + miMain.validateEmail("u.u@hotmail.cc"));
  45.        System.out.println("email: " + "u u@hotmail.cc " + miMain.validateEmail("u u@hotmail.cc"));
  46.        System.out.println("email: " + "uu@h.cc " + miMain.validateEmail("uu@h.cc"));
  47.        System.out.println("email: " + "5u@h.cc " + miMain.validateEmail("5u@h.cc"));
  48.        System.out.println("email: " + "uu@hh.cc " + miMain.validateEmail("uu@hh.cc"));
  49.        System.out.println("email: " + "5uu@hh.cc " + miMain.validateEmail("5uu@hh.cc"));
  50.        System.out.println("email: " + "5uu@h.cc " + miMain.validateEmail("5uu@h.cc"));
  51.        System.out.println("email: " + "5.cc " + miMain.validateEmail("5.cc"));
  52.        System.out.println("email: " + "5@h.cc " + miMain.validateEmail("5@h.cc"));
  53.        System.out.println("email: " + "5@h.cc.d " + miMain.validateEmail("5@h.cc.d"));
  54.        System.out.println("email: " + "5@h.cc.dd " + miMain.validateEmail("5@h.cc.dd"));
  55.        System.out.println("email: " + "5@h.c.dd " + miMain.validateEmail("5@h.c.dd"));
  56.        System.out.println("email: " + "avf-@h.c.dd " + miMain.validateEmail("avf-@h.c.dd"));
  57.        System.out.println("email: " + "a-vf@h.c.dd " + miMain.validateEmail("a-vf@h.c.dd"));
  58.        System.out.println("email: " + "avf@h.c.dd " + miMain.validateEmail("avf@h.c.dd"));
  59.        System.out.println("email: " + "-avf@h.c.dd " + miMain.validateEmail("-avf@h.c.dd"));
  60.        System.out.println("email: " + "_avf@h.c.dd " + miMain.validateEmail("_avf@h.c.dd"));
  61.        System.out.println("email: " + "a-_-_.-_b--d__-@h.c.dd " + miMain.validateEmail("a-_-_.-_b--d__-@h.c.dd"));
  62.        System.out.println("email: " + "a_._-@h.c.dd " + miMain.validateEmail("a_._-@h.c.dd"));
  63.        System.out.println("email: " + "a_.-@h.c.dd " + miMain.validateEmail("a_.-@h.c.dd"));
  64.        System.out.println("email: " + "a.-@h.c.dd " + miMain.validateEmail("a.-@h.c.dd"));
  65.  
  66.        System.out.println("*****************************validateRightEmail******************************************");
  67.        System.out.println("email: " + "cs.uns.edu.ar " + miMain.validateRightEmail("cs.uns.edu.ar"));
  68.        System.out.println("email: " + "computer_name.net_name.com " + miMain.validateRightEmail("computer_name.net_name.com"));
  69.        System.out.println("email: " + "comp#uter_name.net_name.com " + miMain.validateRightEmail("comp#uter_name.net_name.com"));
  70.        System.out.println("email: " + "computer_name.net_na#me.com " + miMain.validateRightEmail("computer_name.net_na#me.com"));
  71.        System.out.println("email: " + "hotm@ail.co " + miMain.validateRightEmail("hotm@ail.co"));
  72.        System.out.println("email: " + "hotmail.co " + miMain.validateRightEmail("hotmail.co"));
  73.        System.out.println("email: " + "hotmail.c " + miMain.validateRightEmail("hotmail.c"));
  74.        System.out.println("email: " + "h.cc " + miMain.validateRightEmail("h.cc"));
  75.        System.out.println("email: " + "hh.cc " + miMain.validateRightEmail("hh.cc"));
  76.        System.out.println("email: " + "5.cc " + miMain.validateRightEmail("5.cc"));
  77.        System.out.println("email: " + "h.cc.d " + miMain.validateRightEmail("h.cc.d"));
  78.        System.out.println("email: " + "h.cc.dd " + miMain.validateRightEmail("h.cc.dd"));
  79.        System.out.println("email: " + "h.c.dd " + miMain.validateRightEmail("h.c.dd"));
  80.        System.out.println("email: " + "ail.co " + miMain.validateRightEmail("ail.co"));
  81.        System.out.println("email: " + "hotm@ail.co " + miMain.validateRightEmail("hotm@ail.co"));
  82.        System.out.println("email: " + "hotm " + miMain.validateRightEmail("hotm"));
  83.        System.out.println("email: " + "hotmail.co " + miMain.validateRightEmail("hotmail.co"));
  84.        System.out.println("email: " + "hotmail.c " + miMain.validateRightEmail("hotmail.c"));
  85.        System.out.println("email: " + "hotmail.cc " + miMain.validateRightEmail("hotmail.cc"));
  86.        System.out.println("email: " + "h.cc " + miMain.validateRightEmail("h.cc"));
  87.        System.out.println("email: " + "5.cc " + miMain.validateRightEmail("5.cc"));
  88.        System.out.println("email: " + "h.cc.d " + miMain.validateRightEmail("h.cc.d"));
  89.        System.out.println("email: " + "h.cc.dd " + miMain.validateRightEmail("h.cc.dd"));
  90.        System.out.println("email: " + "5h.c.dd " + miMain.validateRightEmail("5h.c.dd"));
  91.  
  92.        System.out.println("*****************************validateLeftEmail******************************************");
  93.        System.out.println("email: " + "!u@hotm " + miMain.validateLeftEmail("!u"));
  94.        System.out.println("email: " + "u " + miMain.validateLeftEmail("u"));
  95.        System.out.println("email: " + "uu " + miMain.validateLeftEmail("uu"));
  96.        System.out.println("email: " + "!u " + miMain.validateLeftEmail("!u"));
  97.        System.out.println("email: " + ".u " + miMain.validateLeftEmail(".u"));
  98.        System.out.println("email: " + "u.u " + miMain.validateLeftEmail("u.u"));
  99.        System.out.println("email: " + "u u " + miMain.validateLeftEmail("u u"));
  100.        System.out.println("email: " + "5u " + miMain.validateLeftEmail("5u"));
  101.        System.out.println("email: " + "5.cc " + miMain.validateLeftEmail("5.cc"));
  102.        System.out.println("email: " + "5 " + miMain.validateLeftEmail("5"));
  103.        System.out.println("email: " + "avf- " + miMain.validateLeftEmail("avf-"));
  104.        System.out.println("email: " + "a-vf " + miMain.validateLeftEmail("a-vf"));
  105.        System.out.println("email: " + "avf " + miMain.validateLeftEmail("avf"));
  106.        System.out.println("email: " + "-avf " + miMain.validateLeftEmail("-avf"));
  107.        System.out.println("email: " + "_avf " + miMain.validateLeftEmail("_avf"));
  108.        System.out.println("email: " + "a-_-_.-_b--d__- " + miMain.validateLeftEmail("a-_-_.-_b--d__-"));
  109.        System.out.println("email: " + "a_._- " + miMain.validateLeftEmail("a_._-"));
  110.        System.out.println("email: " + "a_.- " + miMain.validateLeftEmail("a_.-"));
  111.        System.out.println("email: " + "a.- " + miMain.validateLeftEmail("a.-"));
  112.    }
  113. }
  114.  
  115.  


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: Danther en 3 Agosto 2009, 20:49 pm
¿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)


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: Debci en 3 Agosto 2009, 21:04 pm
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


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: kinos en 3 Agosto 2009, 21:45 pm
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://www.programacion.com/java/articulo/expresionesreg/)

http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html (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.


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: Danther en 3 Agosto 2009, 22:22 pm
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"


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: kinos en 3 Agosto 2009, 22:41 pm
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".


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: Danther en 3 Agosto 2009, 23:45 pm
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]+)+


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: 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).


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: kinos en 4 Agosto 2009, 16:52 pm
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...  :(


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: Danther en 4 Agosto 2009, 17:25 pm
[a-zA-Z0-9][a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)*@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+

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


Título: Re: validar email o dirección de correo con Pattern y Matcher
Publicado por: kinos en 4 Agosto 2009, 19:06 pm
Hola Danther, he estao mirando el codigo y en validateEmail() yo quitaría lo de "validate country code" porque creo que se podría hacer directamente con la expresión regular.

En este sitio he visto también una expresión regular pero creo que es .net:

http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx

  string pattern = @"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$";


Código
  1. package expresionesregularesemail;
  2. import java.util.regex.*;
  3. import java.util.StringTokenizer;
  4.  
  5. public class Main {
  6. public boolean validateEmail(String email){
  7.    //Pattern p = Pattern.compile("[a-zA-Z0-9]+[.[a-zA-Z0-9_-]+]*@[a-zA-Z0-9_]+[.[a-zA-Z]+]+"); //original
  8.    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]$");
  9.  
  10.  
  11.   //@"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|"+ @"([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)" + @"@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$"
  12.  
  13.   // Match the given string with the pattern
  14.   Matcher m = p.matcher(email);
  15.   return m.matches();
  16. }
  17.    public static void main(String[] args) {
  18.        Main miMain = new Main();
  19.        System.out.println("*****************************validateEmail******************************************");
  20.        System.out.println("email: "+"example@cs.uns.edu.ar "+miMain.validateEmail("example@cs.uns.edu.ar"));
  21.        System.out.println("email: "+"name-surname@computer_name.net_name.com "+miMain.validateEmail("name-surname@computer_name.net_name.com"));
  22.        System.out.println("email: "+"!u@hotm@ail.co "+miMain.validateEmail("!u@hotm@ail.co"));
  23.        System.out.println("email: "+"u@hotm@ail.co "+miMain.validateEmail("u@hotm@ail.co"));
  24.        System.out.println("email: "+"u@hotmail.co "+miMain.validateEmail("u@hotmail.co"));
  25.        System.out.println("email: "+"u@hotmail.c "+miMain.validateEmail("u@hotmail.c"));
  26.        System.out.println("email: "+"!u@hotmail.cc "+miMain.validateEmail("!u@hotmail.cc"));
  27.        System.out.println("email: "+"uu@hotmail.cc "+miMain.validateEmail("uu@hotmail.cc"));
  28.        System.out.println("email: "+"@hotmail.cc "+miMain.validateEmail("@hotmail.cc"));
  29.        System.out.println("email: "+".u@hotmail.cc "+miMain.validateEmail(".u@hotmail.cc"));
  30.        System.out.println("email: "+"u.u@hotmail.cc "+miMain.validateEmail("u.u@hotmail.cc"));
  31.        System.out.println("email: "+"u u@hotmail.cc "+miMain.validateEmail("u u@hotmail.cc"));
  32.        System.out.println("email: "+"u@h.cc "+miMain.validateEmail("5u@h.cc"));
  33.        System.out.println("email: "+"5u@h.cc "+miMain.validateEmail("5u@h.cc"));
  34.        System.out.println("email: "+"5.cc "+miMain.validateEmail("5.cc"));
  35.        System.out.println("email: "+"5@h.cc "+miMain.validateEmail("5@h.cc"));
  36.        System.out.println("email: "+"5@h.cc.d "+miMain.validateEmail("5@h.cc.d"));
  37.        System.out.println("email: "+"5@h.cc.dd "+miMain.validateEmail("5@h.cc.dd"));
  38.        System.out.println("email: "+"5@h.c.dd "+miMain.validateEmail("5@h.c.dd"));
  39.        System.out.println("email: "+"avf-@h.c.dd "+miMain.validateEmail("avf-@h.c.dd"));
  40.        System.out.println("email: "+"a-vf@h.c.dd "+miMain.validateEmail("a-vf@h.c.dd"));
  41.        System.out.println("email: "+"avf@h.c.dd "+miMain.validateEmail("avf@h.c.dd"));
  42.        System.out.println("email: "+"-avf@h.c.dd "+miMain.validateEmail("-avf@h.c.dd"));
  43.        System.out.println("email: "+"_avf@h.c.dd "+miMain.validateEmail("_avf@h.c.dd"));
  44.        System.out.println("email: "+"a-_-_.-_b--d__-@h.c.dd "+miMain.validateEmail("a-_-_.-_b--d__-@h.c.dd"));
  45.        System.out.println("email: "+"a_._-@h.c.dd "+miMain.validateEmail("a_._-@h.c.dd"));
  46.        System.out.println("email: "+"a_.-@h.c.dd "+miMain.validateEmail("a_.-@h.c.dd"));
  47.        System.out.println("email: "+"a.-@h.c.dd "+miMain.validateEmail("a.-@h.c.dd"));
  48.  
  49.    }
  50. }
  51.