2013-04-05 50 views
0

我有以下方法來驗證我的電子郵件地址在窗體中。如何驗證「。」在電子郵件地址?

-(BOOL) validEmailAddress:(NSString*) emailString { 
    NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+.[A-Z]{2,4}$"; 
    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil]; 
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])]; 
    if (regExMatches == 0) 
     return NO; // email invalid 
    else 
     return YES; // email valid 
    } 

這個偉大的工程,除了它打破瞭如果用戶給出「ABC @ XYZ」的電子郵件(不象.com或.org超級域)。

我很確定問題與「。」有關。在我的正則表達式中。我試圖像這樣逃脫它,

NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$"; 

但這也行不通。有什麼建議麼?

編輯:當最初發布問題時,我沒有在最後一個點之前進行轉義。抱歉。

+1

你是什麼意思*分解*?您的功能是否將'abc @ xyz'視爲有效的電子郵件地址?如果是這樣,那很好,因爲'abc @ xyz' *是一個有效的電子郵件地址。 – Oswald 2013-04-05 22:51:42

+0

您可能需要查看http://www.regular-expressions.info/email.html關於驗證具有正則表達式的電子郵件的其他提示 – david 2013-04-05 22:57:10

+1

和http://data.iana.org/TLD/tlds -alpha-by-domain.txt查看有效頂級域名列表 – david 2013-04-05 23:06:14

回答

0

我沒有看到你的最後一個例子轉義序列完成。嘗試:

NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$"; 
+0

我試着用一個反斜槓,它不起作用,加上編譯器抱怨它不是一個公認的轉義序列。所以你必須避開這個小點並且避開反斜槓?我現在正在嘗試。 – 2013-04-06 00:22:58

+0

@ Justin-NicholasY.Toyama是的,這是一個奇怪的正則表達式怪癖。由於\是一個你可能希望包含在你的正則表達式中的字符,所以你必須將它加倍以表明它是一個轉義序列。 \。意思是「斜線後跟任何字符」(因爲。是通配符),而\\。意味着一個字面點。 – 2013-04-06 01:24:50

+0

謝謝,比爾。您的解決方案對於我正在努力完成的任務而言令人滿意 – 2013-04-06 01:44:56

0

你必須逃避最後一個點。因此,你的表達是:

^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$ 

然而,由於\也被Objective C的解釋爲轉義字符,你將不得不逃避它。這在客觀C利用雙反斜線(\\

NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$"; 
+0

我試過了。這不起作用。比爾蜥蜴的代碼工程,雖然我不知道爲什麼。 – 2013-04-06 00:27:36

+0

實際的正則表達式只有一個反斜槓。然而,'\'也被解釋爲Objective C中的轉義字符,並且需要在那裏轉義以及最終導致它們中的2個。 – david 2013-04-06 06:14:17

0

您需要轉義點,是的。

要接受「abc @ xyz」,您還需要將點和其後的所有內容都設爲可選。你可以通過將它封裝在圓括號中,然後用一個問號來做到這一點,如:

^[A-Z0-9._%+-][email protected][A-Z0-9.-]+(\.[A-Z]{2,4})?$ 
+0

如果@ Oswald的評論是正確的,那麼如果它有效,這是一個很好的實現。我會檢查出來的。謝謝。 – 2013-04-06 00:29:01

+1

@ Justin-NicholasY.Toyama爲了增加一點複雜性,如果你想要接受任何有效的電子郵件地址,這是無法詳盡無遺的,正如維基百科的[有效電子郵件地址示例](http: //en.wikipedia.org/wiki/Email_address#Valid_email_addresses) – femtoRgon 2013-04-06 00:59:18