web-dev-qa-db-ja.com

Swiftでメールアドレスを検証するためのベストプラクティスは何ですか?

私はSwiftで電子メール(文字列)を検証するための最もシンプルでクリーンな方法を探しています。 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];
}
15
animal_chin

かなり簡単に思えます。 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("[email protected]")     // true
validateEmail("invalid@@google.com") // false
37
Craig Otis

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("[email protected]")     // true
validateEmail("invalid@@google.com") // false
6
Jordi Bruin
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)
    }
}
2
Darkngs

ここに私の2セントを投入し、カーブボールを打ちます。

このようにメールアドレスを検証してもよろしいですか?

これを参照してください blogpost これは、メールが有効であることを確認するために必要なすべてのことは、@記号、または多くても@が後に続く.

/.+@.+\..+/i

1
Matthew Hallatt

これは、すべてのメールドメインで機能する拡張機能です。

例:.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)
     }
}
1
Sohil R. Memon
      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
      }
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)
}
0
timv

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")
    }
}

例えば.

"[email protected]".isEmail  // true
"foo.mc'[email protected]".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が電子メール検証のための文字列にメソッドを含まないだけなのかは謎です。

0
Some One

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
  }
}
0
Fabio