2011-11-24 109 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); 

它的工作我做了一些快速測試。

考慮將編譯後的模式存儲在常量中以提高性能。