2014-10-03 109 views
13

我正在尋找最簡單和最乾淨的方法來驗證電子郵件(字符串)在Swift中。在Objective-C中,我使用了這種方法,但是如果我將它重寫到Swift中,創建謂詞時出現錯誤「無法解析格式字符串」。在Swift中驗證電子郵件地址的最佳做法是什麼?

- (BOOL) validateEmail: (NSString *) candidate { 
    NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"; 
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 

    return [emailTest evaluateWithObject:candidate]; 
} 
+1

普萊斯e總是發佈你的代碼不工作。 – 2014-10-03 14:35:01

回答

33

看起來很簡單。如果你的Swift轉換有問題,如果看看你實際嘗試過的東西可能會有所幫助。

這個工作對我來說:

func validateEmail(candidate: String) -> Bool { 
    let emailRegex = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" 
    return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate) 
} 

validateEmail("[email protected]")  // true 
validateEmail("[email protected]@google.com") // false 
+0

那麼差異只在於我們如何將emailRegex插入到謂詞中...... func isEmailValid(strEmail:String) - > Bool {var _EmailRegex =「[A-Z0-9a-z \\ ._% - ] + @([A-Za-z0-9 - ] + \\。)+ [A-Za-z] {2,6}「 var predicateEmail = NSPredicate(格式:」SELF MATCHES \(strEmailRegex)「 ) return predicateEmail.evaluateWithObject(strEmail) } – 2014-10-03 14:35:57

+0

右鍵 - 這不起作用,因爲您尚未向NSPredicate初始化程序提供任何格式參數。您仍然需要使用'%@'並通過最後的可變參數列表傳遞它。 – 2014-10-03 14:37:36

+0

謝謝!我現在得到它 - 我只需要看看NSPredicate的init函數稍微長一點:) – 2014-10-03 14:43:12

0
 class func isValidEmail(email:String)-> Bool 
     { 
      let emailRegEx = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" 
      var emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) 
      let result = emailTest!.evaluateWithObject(email) 
      return result 
     } 
0

克雷格斯回答的作品,如果有人正在努力實現它,在這裏它與textFieldDidEndEditing FUNC調用它。 (UITextFieldDelegate需要)

func textFieldDidEndEditing(textField: UITextField) 
{ 
    if validateEmail(emailAddress.text) 
    { 
     println("valid") 
    } 
    else 
    { 
     println("NOT valid") 
    } 
} 

func validateEmail(candidate: String) -> Bool { 
    let emailRegex = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" 
    return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate) 
} 
2
extension String 
{ 
    func isEmail() -> Bool 
    { 
     let emailRegex = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" 
     return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(self) 
    } 
} 
1

這裏是正在爲每一個電子郵件域擴展名。

例:.com.co.uk.co.in

extension String { 

    func isValidEmail() -> Bool { 

     let emailRegEx = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" 
     let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) 
     return emailTest.evaluateWithObject(self) 
    } 
} 
2

只是要在我的兩分錢這裏扔,打你一個曲線球:

你真的想驗證你的電子郵件地址嗎?

參見本blogpost這表明所有你需要做檢查的電子郵件是有效的就是檢查它有一個@符號,或最多一@其次在某些時候由.

/[email protected]+\..+/i

6

雨燕3.0的版本

func validateEmail(candidate: String) -> Bool { 
    let emailRegex = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,6}" 
    return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: candidate) 
} 

validateEmail("[email protected]")  // true 
validateEmail("[email protected]@google.com") // false 
0
func isValidEmail(testStr: String) -> Bool { 
    print("valid Email-ID: \(testStr)") 
    let emailRegEx = "[A-Za-z0-9_%+-][email protected][A-Za-z0-9._]+\\.[A-Za-z]{2,}" 
    let emailTest = NSPredicate(format: "SELF MATCHES %@",emailRegEx) 
    return emailTest.evaluateWithObject(testStr) 
} 
func textFieldDidEndEditing(textField: UITextField) { 
    if isValidEmail(txt_EmailID.text!){ 
     print("Email is Valid") 
    }else{ 
     print("Email is not valid") 
    } 
} 

// creat done button outlet 

@IBAction func btn_Done(sender: AnyObject) { 
    validated() 

}