在Swift中验证电子邮件地址的最佳做法是什么?

时间:2014-10-03 14:29:11

标签: ios objective-c iphone swift nspredicate

我正在寻找在Swift中验证电子邮件(String)的最简单,最干净的方法。在Objective-C中我使用了这个方法,但是如果我将它重写为Swift,则在创建谓词时会出现“无法解析格式字符串”的错误。

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

    return [emailTest evaluateWithObject:candidate];
}

10 个答案:

答案 0 :(得分:37)

看起来很简单。如果您在使用Swift转换时遇到问题,那么查看您实际尝试的内容可能会有所帮助。

这对我有用:

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

validateEmail("test@google.com")     // true
validateEmail("invalid@@google.com") // false

答案 1 :(得分:6)

Swift 3.0版本

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

validateEmail("test@google.com")     // true
validateEmail("invalid@@google.com") // false

答案 2 :(得分:2)

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

答案 3 :(得分:1)

以下是适用于每个电子邮件域的扩展程序。

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

extension String {

     func isValidEmail() -> Bool {

         let emailRegEx = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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)
     }
}

答案 4 :(得分:1)

在这里投入我的2美分用曲线球打你:

您真的想要验证您的电子邮件地址吗?

请参阅此blogpost,其中建议您检查电子邮件是否有效需要做的就是检查它是否有@符号,或者最多只有@后跟一个. /.+@.+\..+/i

(?:[a-zA-Z_][a-zA-Z0-9_]*|\.\.\.|,\s*)*

答案 5 :(得分:0)

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

答案 6 :(得分:0)

Craigs回答有效,如果有人正在努力实现它,这里是用textFieldDidEndEditing函数调用它。 (需要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._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
    return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate)
}

答案 7 :(得分:0)

Swift 4只需设置:

extension String {
var isEmail: Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: self)
 }
}

添加

UITextFieldDelegate

在viewDidLoad中:

yourTextField.delegate = self

用法:

func textFieldDidEndEditing(_ textField: UITextField) {

    guard let validEmailAddress = yourTextFiled.text else { return }
    if !(validEmailAddress.isEmail) {
        //is invalid address
    } else {
       //is valid address
  }
}

答案 8 :(得分:0)

我使用NSDataDetector API。这里的许多答案都不支持电子邮件地址中允许使用的字符,例如'

extension String {
    var isEmail: Bool {
        let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
        let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: count))
        return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
    }
}

例如

"foo@bar.com".isEmail  // true
"foo.mc'doo@foo-bar.com".isEmail   // true

我还使用了来自Android SDK的正则表达式,效果很好:

[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+

为什么Apple不只是在String上包含用于电子邮件验证的方法,这还是一个谜。

答案 9 :(得分:-1)

Region Sales Cost
North 139 35
South 786 295
South 312 117
East 288 108
North 149 56
West 508 127
North 145 54
South 379 142
East 500 188