web-dev-qa-db-ja.com

電子メールアドレスを迅速に検証する方法

Swiftで電子メールアドレスを検証する方法を知っている人はいますか?私はこのコードを見つけました:

- (BOOL) validEmail:(NSString*) emailString {

    if([emailString length]==0){
        return NO;
    }

    NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";

    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];

    NSLog(@"%i", regExMatches);
    if (regExMatches == 0) {
        return NO;
    } else {
        return YES;
    }
}

しかし、私はそれをSwiftに翻訳することはできません。

270
Giorgio Nocera

私はNSPredicateを使います。

 func isValidEmail(testStr:String) -> Bool {        
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: testStr)
}

Swiftの3.0より前のバージョンの場合:

 func isValidEmail(testStr:String) -> Bool {

    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: testStr)
}

1.2より前のSwiftのバージョンの場合:

 class func isValidEmail(testStr:String) -> Bool {

    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    if let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) {
        return emailTest.evaluateWithObject(testStr)
    }
    return false
}
666
Maxim Shoustin

Swift 3用に更新された編集:

func validateEmail(enteredEmail:String) -> Bool {

    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
    return emailPredicate.evaluate(with: enteredEmail)

}

Swift 2のオリジナルの答え:

func validateEmail(enteredEmail:String) -> Bool {

    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
    return emailPredicate.evaluateWithObject(enteredEmail)

}

それはうまくいっています。

101
Azik Abdullah

Stringクラスの拡張として

スイフト4

extension String {
    func isValidEmail() -> Bool {
        // here, `try!` will always succeed because the pattern is valid
        let regex = try! NSRegularExpression(pattern: "^[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])?)*$", options: .caseInsensitive)
        return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
    }
}

使用法

if "rdfsdsfsdfsd".isValidEmail() {

}
100
Arsonik

これを行うためのクリーンでシンプルなソリューションを探しているなら、 https://github.com/nsagora/validation-components をご覧ください。

それはあなたのコードに簡単に統合できるEメール検証述語を含みます:

let email = "[email protected]"
let rule = EmailValidationPredicate()
let isValidEmail = rule.evaluate(with: email)

裏側ではRFC 5322 reg ex( http://emailregex.com )を使用しています。

let regex = "(?:[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}" +
    "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
    "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\p{L}0-9](?:[a-" +
    "z0-9-]*[\\p{L}0-9])?\\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?|\\[(?:(?:25[0-5" +
    "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
    "9][0-9]?|[\\p{L}0-9-]*[\\p{L}0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
    "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"
43
alexcristea

これが合理的な解決策です:

「合理的な解決策」

多くの大容量アプリで長年使用され、テストされています。

1 - これらの提案でよく見かける非常に多くの正規表現の間違いを避けます

2 - それはNOTは "x @ x"のような技術的には有効だが完全に馬鹿げた愚かなEメールを許可します - そしてあなたのサポートスタッフはとにかく即座に拒絶するでしょう。愚かなEメールを許可する解決策が必要な場合は、別の解決策を使用してください。

3 - コードは非常に分かりやすい

4 - KISS、信頼性が高く、 膨大な数のユーザーを含む商用アプリケーションでの破壊テストが行​​われました

let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,8}"
let __emailPredicate = NSPredicate(format: "SELF MATCHES %@", __emailRegex)

extension String {
    func isEmail() -> Bool {
        return __emailPredicate.evaluate(with: self)
    }
}

extension UITextField {
    func isEmail() -> Bool {
        return self.text.isEmail()
    }
}

説明:

以下の説明では、「OC」は通常の文字、つまり文字または数字を意味します。

__firstpart ...はOCで始まり終わります。真ん中の文字には、アンダースコアなどのいくつかの変わった文字を含めることができますが、開始と終了はOCにする必要があります。 (ただし、大括弧に注意してください。たとえばOCは1つだけでいいのです。たとえば、[email protected]

__serverpart ... "blah"のようなセクションがあります。繰り返します。 (つまりmail.city.fcu.eduタイプのものです。)セクションはOCで始まり終わりにする必要がありますが、途中でダッシュ " - "を使うこともできます。 (そこに他の変わった文字を許可したい場合は、アンダースコアを付け、ダッシュの前に追加してください。)ただ1つのOCであるセクションを持つことは問題ありません。 ([email protected]のように)あなたは5つまでのセクションを持つことができます。あなたが持っている必要があります。最後にTLD(.comなど)のサイズは厳密に2から8です。


!!重要です!

述語はグローバルとして保持しなければなりません。毎回構築しないでください。

!!これは、Appleがこの問題について最初にドコモで言及したものです。

述語をキャッシュしない提案があるのを見るととても驚きです。

24
Fattie

これは正しい正規表現を持つ2つの最も賛成投票された答えを融合したものです。

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

これはSwift 2.0 - 2.2のアップデート版です。

 var isEmail: Bool {
    do {
        let regex = try NSRegularExpression(pattern: "^[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])?)*$", options: .CaseInsensitive)
        return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
    } catch {
        return false
    }
}

Stringの拡張として使うことをお勧めします。

extension String {    
    public 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: length))

        return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
    }

    public var length: Int {
        return self.characters.count
    }
}

そしてそれを使う:

if "[email protected]".isEmail { // true
    print("Hold the Door")
}
14
JeffersonBe

これはrangeOfStringに基づく方法です。

class func isValidEmail(testStr:String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch)
    let result = range != nil ? true : false
    return result
}

注:TLDの長さを更新しました。

これはRFC 5322に従った電子メールのための決定的なRegExです。これは電子メールアドレスの基本的な構文をチェックするだけでトップレベルドメインが存在するかどうかをチェックしないので最もよく使われないことに注意してください。

(?:[a-z0-9!#$%& '* +/=?^ _ `{|}〜 - ] +(?:\。[a-z0-9!#$% & '* +/=?^ _ `{|}〜 - ] +)* 
 |"(?:[\ x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f] 
 | \\ [\ x01-\x09\x0b\x0c\x0e-\x7f])* ")
 @(?:(?:[a- z 0-9](?:[a-z 0-9  - ] * [a-z 0-9])\。)+ [a-z 0-9](?:[a-z 0-9  - ] * [a -z 0-9])?
 |\[(?:( ?: 25 [0-5] | 2 [0-4] [0-9] | [01]?[0-9] [ {3} 
(?:25 [0-5] | 2 [0-4] [0-9] | [01]?[0-9] [0 -9]?| [[a-z0-9  - ] * [a-z0-9]:
(?:[\ x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f] 
 | \\ [\ x01-\x09\x0b\x0c\x0e-\x7f])+)
 \])

電子メールの正規表現の詳細については、 Regular-Expressions.info を参照してください。

Objective-CやSwiftなどの言語では、エスケープ処理は必要ありません。

8
zaph

ここには正しい答えがたくさんありますが、多くの「正規表現」は不完全であり、「name @ domain」のような電子メールが有効な電子メールになることがありますが、そうではありません。これが完全な解決策です。

extension String {

    var isEmailValid: Bool {
        do {
            let regex = try NSRegularExpression(pattern: "(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
            return false
        }
    }
}
7
Andrea.Ferrando

私はそのために拡張子を使うのが好きです。そのうえ、このURL http://emailregex.com は、正規表現が正しいかどうかをテストするのに役立ちます。実際、このサイトではいくつかのプログラミング言語に対して異なる実装を提供しています。 Swift 3 のために私の実装を共有します。

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

Swift 2.1の場合:これはemail foo @ barでは正しく機能します。

extension String {
    func isValidEmail() -> Bool {
        do {
            let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
                return false
        }
    }
}
6
lee5783

Swift 4.2の使用

extension String {
    func isValidEmail() -> Bool {
        let regex = try? NSRegularExpression(pattern: "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$", options: .caseInsensitive)
        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
    }
    func isValidName() -> Bool{
        let regex = try? NSRegularExpression(pattern: "^[\\p{L}\\.]{2,30}(?: [\\p{L}\\.]{2,30}){0,2}$", options: .caseInsensitive)

        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
    } }

そして使用

if (textField.text?.isValidEmail())! 
    {
      // bla bla
    }
else 
    {

    }
5
ikbal

Swift 5の最も簡単な方法

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

"[email protected]".isValidEmail

戻る...

true
4
Ken Mueller

単純な拡張子を作成します。

extension NSRegularExpression {

    convenience init(pattern: String) {
        try! self.init(pattern: pattern, options: [])
    }
}

extension String {

    var isValidEmail: Bool {
        return isMatching(expression: NSRegularExpression(pattern: "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"))
    }

    //MARK: - Private

    private func isMatching(expression: NSRegularExpression) -> Bool {
        return expression.numberOfMatches(in: self, range: NSRange(location: 0, length: characters.count)) > 0
    }
}

例:

"[email protected]".isValidEmail //true
"b@bb".isValidEmail //false

次の拡張子をあなたが必要とするものに拡張することができます:isValidPhoneNumberisValidPasswordなど...

Swift 4.2 およびXcode 10.1

//Email validation
func isValidEmail(email: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
    if valid {
        valid = !email.contains("Invalid email id")
    }
    return valid
}

//Use like this....
let emailTrimmedString = emailTF.text?.trimmingCharacters(in: .whitespaces)
if isValidEmail(email: emailTrimmedString!) == false {
   SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter valid email")
}

あなたがSharedClassを使いたいならば。

//This is SharedClass
import UIKit
class SharedClass: NSObject {

static let sharedInstance = SharedClass()

//Email validation
func isValidEmail(email: String) -> Bool {
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
    var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
    if valid {
        valid = !email.contains("Invalid email id")
    }
    return valid
}

private override init() {

}
}

そして、このように関数を呼び出します....

if SharedClass.sharedInstance. isValidEmail(email: emailTrimmedString!) == false {
   SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter correct email")
   //Your code here
} else {
   //Code here
}
2
iOS

入力検証用に設計されたライブラリを作成しました。「モジュール」の1つを使用すると、たくさんのものを簡単に検証できます。

たとえば、Eメールを検証するには

let emailTrial = Trial.Email
let trial = emailTrial.trial()

if(trial(evidence: "[email protected]")) {
   //email is valid
}

SwiftCop はライブラリです。

2
Andres

これは "THE REASONABLE SOLUTION" @FattieによるSwift 4.1でテストされたString+Email.Swiftという新しいファイルでの新しいバージョンです。

import Foundation

extension String {
    private static let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
    private static let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
    private static let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,6}"

    public var isEmail: Bool {
        let predicate = NSPredicate(format: "SELF MATCHES %@", type(of:self).__emailRegex)
        return predicate.evaluate(with: self)
    }
}

その使い方は簡単です。

let str = "[email protected]"
if str.isEmail {
    print("\(str) is a valid e-mail address")
} else {
    print("\(str) is not a valid e-mail address")
}

私は単にfuncStringオブジェクトに追加したくありません。電子メールアドレスであることはそれらに固有のものであるかどうかにかかわらずです。だから私の理解からするとBoolプロパティはfuncよりよくフィットします。

2
Alejandro Iván

Swift 5 Email Validator - 正規表現

この種の実装には、String拡張、非常に優れた検証、そしてRFC 2822の完全な検証など、非常に簡単な方法で使用できるという機能があります。

ステップ1)[ファイル] - > [新規] - > [ファイル] - > [Swift File]をクリックして、次のコードをコピーします。

import Foundation

extension String {

    // Checks if the `String` is a valid email address.
    func isValidEmailAddress() -> Bool {
        let emailRegEx = "(?:[a-zA-Z0-9!#$%\\&‘*+/=?\\^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%\\&'*+/=?\\^_`{|}"
            + "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\"
            + "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-"
            + "z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5"
            + "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-"
            + "9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21"
            + "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

        let emailTest = NSPredicate(format: "SELF MATCHES[c] %@", emailRegEx)
        return emailTest.evaluate(with: self)
    }
}

ステップ2)文字列拡張としてのEメールバリデータの使用

@IBAction func sendEmail(_ sender: Any) {
    if let textFieldText = emailTextField.text, textFieldText.isValidEmailAddress() {
        // APICall or present next desired view controller
    } else {
        // Present an alert to tell user that is invalid email
    }
}

例:

ソース: GitHubリンク

0
Doca

Swift 5

 func isValidEmailAddress(emailAddressString: String) -> Bool {

 var returnValue = true
 let emailRegEx = "[A-Z0-9a-z.-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,3}"

 do {
        let regex = try NSRegularExpression(pattern: emailRegEx)
        let nsString = emailAddressString as NSString
        let results = regex.matches(in: emailAddressString, range: NSRange(location: 0, length: nsString.length))

        if results.count == 0
        {
            returnValue = false
        }

    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        returnValue = false
    }

    return  returnValue
}

次に:

let validEmail = isValidEmailAddress(emailAddressString: "[email protected]")
print(validEmail)
0
Arafin Russell

これはSwift 3の拡張です。

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

このように使うだけです:

if yourEmailString.isValidEmail() {
    //code for valid email address
} else {
    //code for not valid email address
}
0
Gefilte Fish

@Azikの回答を改善しました。ガイドラインで許可されているより多くの特殊文字を許可します。また、いくつかの余分なEdgeケースを無効として返します。

グループは、ローカル部分でのみ._%+-を許可するためにここで進むことは、ガイドラインに従って正しくありません。 これ @質問で@Anton Gogolevの回答を参照するか、以下を参照してください。

電子メールアドレスのローカル部分には、これらのASCII文字を使用できます。

  • 大文字と小文字のラテン文字AからZaからz

  • 0から9までの数字。

  • 特殊文字!#$%&'*+-/=?^_`{|}~;

  • ドット.、引用符で囲まない限り最初または最後の文字ではないこと、および引用符で囲まない限り連続して表示されないこと(ただし、[email protected]は許可されないが"John..Doe"@example.comは許可される)

  • 空白文字と"(),:;<>@[\]文字は制限付きで使用できます(以下の段落で説明するように、引用符付き文字列内でのみ使用できます。さらに、バックスラッシュまたはダブルクォーテーションの前にバックスラッシュを付ける必要があります)。コメントは許可されています

  • ローカル部分の両端に括弧を付けて。例えばjohn.smith(comment)@example.com(comment)[email protected]はどちらも[email protected]と同等です。

私が使用しているコードでは、場所外の特殊文字を制限することはできませんが、ここで説明している大多数の回答よりも多くのオプションを使用できます。私は注意の側でエラーにもっと緩やかな検証を好むでしょう。

if enteredText.contains("..") || enteredText.contains("@@") 
   || enteredText.hasPrefix(".") || enteredText.hasSuffix(".con"){
       return false
}

let emailFormat = "[A-Z0-9a-z.!#$%&'*+-/=?^_`{|}~]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)     
return emailPredicate.evaluate(with: enteredText)
0
JavaBeast

今では奇妙なトップレベルドメイン名がたくさんあるので、トップドメインの長さのチェックをやめます...

これが私が使っているものです:

extension String {

    func isEmail() -> Bool {
        let emailRegEx = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"
        return NSPredicate(format:"SELF MATCHES %@", emailRegEx).evaluateWithObject(self)
    } 
}
0
snowmen10

のための最良の結果と最良の解決策

スイフト4.x

 extension String {

        func validateAsEmail() -> Bool {
            let emailRegEx = "(?:[a-zA-Z0-9!#$%\\&‘*+/=?\\^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%\\&'*+/=?\\^_`{|}" +
                "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
                "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" +
                "z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" +
                "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
                "9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
            "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"

            let emailTest = NSPredicate(format:"SELF MATCHES[c] %@", emailRegEx)
            return emailTest.evaluate(with: self)
        }
    }
0
//Email validation
func validateEmail(enterEmail:String) -> Bool{
    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@",emailFormat)
    return emailPredicate.evaluate(with:enterEmail)
}

100%動作しテスト済み

0

あまりにも動作するようだ...

let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"

func validate(email: String) -> Bool {
    let matches = email.rangeOfString(regex, options: .RegularExpressionSearch)
    if let _ = matches {
        return true
    }
    return false
}
0
Logicopolis

拡張機能を作成したい

   extension String {

func isValidateEmail() -> Bool {
    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
    return emailPredicate.evaluate(with: self)
}

}

使用法:

if emailid.text!.isValidateEmail() == false(){
 //do what ever you want if string is not matched.

}
0
siva kumar

そして Swift 3 :の場合

extension String {
    func isValidEmail() -> Bool {
        let regex = try? NSRegularExpression(pattern: "^[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])?)*$", options: .caseInsensitive)
        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
    }
}
0
Danut Pralea

Swift 2.2に対する@Arsonikの回答を更新し、他の提供されている解決策よりも冗長度の低いコードを使用します。

extension String {
    func isValidEmail() -> Bool {
        let regex = try? NSRegularExpression(pattern: "^[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])?)*$", options: .CaseInsensitive)
        return regex?.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
    }
}
0
Matias Seijas

私が回答のリストに追加したのは、LinuxではNSRegularExpressionが存在しないということだけです。実際にはRegularExpressionです。

    func isEmail() -> Bool {

    let patternNormal = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"

    #if os(Linux)
        let regex = try? RegularExpression(pattern: patternNormal, options: .caseInsensitive)
    #else
        let regex = try? NSRegularExpression(pattern: patternNormal, options: .caseInsensitive)
    #endif

    return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil

これはmacOSとUbuntuの両方で正常にコンパイルされます。

0
Andrei Popa

まだこれに対する答えを探している人のために、以下のフレームワークを見てください。

ATGValidator

これはルールベースの検証フレームワークであり、ほとんどの検証をそのまま使用できます。そして何よりもまず、複数のテキストフィールドの検証を同時にサポートするform validatorがあります。

電子メール文字列を検証するには、次のものを使用します。

"[email protected]".satisfyAll(rules: [StringRegexRule.email]).status

あなたがテキストフィールドからの電子メールを検証したい場合は、以下のコードを試してください。

textfield.validationRules = [StringRegexRule.email]
textfield.validationHandler = { result in
    // This block will be executed with relevant result whenever validation is done.
    print(result.status, result.errors)
}
// Below line is to manually trigger validation.
textfield.validateTextField()

テキストフィールドに入力している間、またはフォーカスが別のフィールドに変更されたときにそれを検証したい場合は、次のいずれかの行を追加してください。

textfield.validateOnInputChange(true)
// or
textfield.validateOnFocusLoss(true)

より多くの使用例については link でreadmeファイルをチェックしてください。

0
Suran

@ JeffersonBeの答えは近いですが、文字列が "[email protected]に有効な電子メールを含むもの"である場合はtrueを返しますが、これは必要な結果ではありません。以下はStringの拡張で、うまく機能します(そして有効なphoneNumberと他のデータディテクタをテストすることができます)。

/// Helper for various data detector matches.
/// Returns `true` iff the `String` matches the data detector type for the complete string.
func matchesDataDetector(type: NSTextCheckingResult.CheckingType, scheme: String? = nil) -> Bool {
    let dataDetector = try? NSDataDetector(types: type.rawValue)
    guard let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length)) else {
        return false
    }
    return firstMatch.range.location != NSNotFound
        // make sure the entire string is an email, not just contains an email
        && firstMatch.range.location == 0
        && firstMatch.range.length == length
        // make sure the link type matches if link scheme
        && (type != .link || scheme == nil || firstMatch.url?.scheme == scheme)
}
/// `true` iff the `String` is an email address in the proper form.
var isEmail: Bool {
    return matchesDataDetector(type: .link, scheme: "mailto")
}
/// `true` iff the `String` is a phone number in the proper form.
var isPhoneNumber: Bool {
    return matchesDataDetector(type: .phoneNumber)
}
/// number of characters in the `String` (required for above).
var length: Int {
    return self.characters.count
}
0
Gujamin