2011-11-19 160 views
9

我想使用NSRegularExpression類來驗證NSString是否是電子郵件地址。NSRegularExpression驗證電子郵件

事情是這樣的僞代碼:

- (BOOL)validateMail : (NSString *)email 
{ 
    NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"" options:NSRegularExpressionCaseInsensitive error:NULL]; 

    if(emailValidated) 
    { 
     return YES; 
    }else{ 
     return NO; 
    } 
} 

但我不知道我究竟是如何驗證一個NSString如果它看起來像這樣的「[email protected]

也許有人可以幫助我這裏。

問候 s4lfish

回答

31

您可以使用:

@"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 

,你可以在這裏進行測試:

http://gskinner.com/RegExr/?2rhq7

並保存該鏈接它會幫助你用正則表達式的未來:

http://gskinner.com/RegExr/

編輯

你可以這樣來做:

NSString *string = @"[email protected]"; 
NSString *expression = @"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 
NSError *error = NULL; 

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 

    if (match){ 
     NSLog(@"yes"); 
    }else{ 
     NSLog(@"no"); 
    } 
+2

哇,看起來很凌亂 –

+0

謝謝,但我的問題是,我沒有找到一個函數來證明輸入的電子郵件適合正則表達式。我查看了蘋果的文檔,但不知何故,NSRegularExpression沒有爲我的「if語句」返回一個布爾值的函數。 – s4lfish

+2

嗨,我已經添加了一個代碼示例。 BTW @Alex Nichol如果你能解釋你的評論,那將會很棒。我的回答可能是錯誤的,但您的評論無法幫助我或任何其他人更好地理解此問題。 – shannoga

8

這是一個老問題,但它足以一般從不出門的風格。

99.9%的電子郵件地址正則表達式錯誤,甚至更少正確處理國際域(IDN)。

試圖做一個全面的電子郵件正則表達式不是一個很好的使用開發時間或用戶CPU週期。

這簡單得多:

  1. 比賽[^@][email protected]([^@]+)

  2. 提取每個匹配的部分領域。

  3. 失敗,如果它匹配禁止域。從JSON端點本地緩存禁止域列表,因此您不必等待重新審批,並且可以即時更新它。 (請務必記錄網站統計信息以進行轉換分析。)

  4. 檢查域是否有DNS記錄。除了MX之外,還請檢查A和AAAA,因爲並非所有域都實施MX。 (跛腳但沒錯。)

  5. 只是嘗試發送電子郵件已經。如果用戶認爲某款應用具有價值,該用戶將再次嘗試。 :))

+0

同意,頂級域名可以超過4個,比如'community','properties'。過於嚴格比沒有更糟。 – chao787

0

斯威夫特4版

我爲那些誰做的雨燕4.0版本的電子郵件正則表達式寫的。 以上可以做如下:

do { 
     let emailRegex = try NSRegularExpression(pattern: "^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$", options: .caseInsensitive) 
     let textRange = NSRange(location: 0, length: email.count) 
     if emailRegex.firstMatch(in: email, options: [], range: textRange) != nil { 
      //Do completion code here 
     } else { 
      //Do invalidation behaviour 
     } 
    } catch { 
     //Do invalidation behaviour 
    } 

假設電子郵件是輸入一個字符串迅速。