2014-10-03 111 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() 

}