2011-11-24 76 views
0

可能重复:
Verify email in Java简单的电子邮件验证

我试图做一个非常简单的电子邮件验证。但问题是,当我尝试类似[email protected]@@@gmail.com它返回true。

这里是代码:

public static boolean validateEmail(String email){ 
     boolean isValidEmail = false; 
     // Input the string for validation 
     // String email = "[email protected]"; 
     // Set the email pattern string 
     Pattern p = Pattern.compile("[email protected]+\\.[a-z]+"); 

     // Match the given string with the pattern 
     Matcher m = p.matcher(email); 

     // check whether match is found 
     boolean matchFound = m.matches(); 

     StringTokenizer st = new StringTokenizer(email, "."); 
     String lastToken = null; 
     while (st.hasMoreTokens()) { 
      lastToken = st.nextToken(); 
     } 

     if (matchFound && lastToken.length() >= 2 
      && email.length() - 1 != lastToken.length()) { 


      // validate the country code 
      isValidEmail = true; 
     } 
     else isValidEmail = false; 

    return isValidEmail; 
} 

请帮助。提前致谢。

回答

6

[email protected]+会匹配任何东西,包括@,其次是@,其次是任何东西,包括@。改为使用[^@][email protected][^@]+。或者停止重新发明轮子,抓住Apache Commons并使用它的EmailValidator

+0

我该如何使用Apache Commons?这是我第一次听说它。 – NinjaBoy

+1

@ChickenBoy:http://commons.apache.org/。这是一个非常好的图书馆。 –

1

应该Pattern p = Pattern.compile("[email protected]{1}+\\.[a-z]+");

但是:

以上这是我的答案是错误的完全一样的答案@larsmans,因为:

这个(评论)[email protected]是有效的电子邮件。

你必须阅读RFC:http://tools.ietf.org/html/rfc5322

事实上,使用一个好的图书馆,作为Apache的公地。

+1

验证电子邮件地址的应用程序没有义务验证电子邮件地址格式的所有变体,只是因为它们被允许在Internet邮件中。此外,如果地址将用于通过SMTP发送电子邮件,请记住,SMTP允许的电子邮件地址格式受到更多限制,并且不包括注释(或者对于此,除了邮箱名称,在符号和FQDN)。 – MetaEd

+0

你从哪里得到这些信息?是否有另一个RFC? –

+0

SMTP已经经历了多次修订。 RFC 821是被指定为标准的最新版本。 SMTP的最新*草案*标准是RFC 5321. – MetaEd

2

这是许多图书馆解决的问题。不要重新实现你自己的。

在正则表达式中使这100%正确得多,比您想象的要难得多。

5

您可以使用类javax.mail.internet.InternetAddress于JavaMail API(有一个validate方法)

+0

我该如何导入?我试过,但它不在我的默认java库中。我对此很新。请帮忙。 – NinjaBoy

+0

它在Java EE发行版中。 –

+0

@ChickenBoy你可以在Oracle的网站上下载这个库。只要寻找“javamail”。如果您使用maven,则可以直接在您的pom.xml中添加依赖项(http://mvnrepository.com/artifact/javax.mail/mail/1.4.4)。 – barjak

2

This site表明,以下模式匹配RFC 5322,涵盖当今使用的大多数电子邮件地址:

Pattern p = Pattern.compile("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", Pattern.CASE_INSENSITIVE); 

它的工作我做了一些快速测试。

考虑将编译后的模式存储在常量中以提高性能。