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


338

誰かが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に翻訳することはできません。


8
翻訳は簡単でなければなりません。どの部分が問題を引き起こしていますか?
スルタン2014

12
ユーザーの誰もが新しいトップレベルドメインの1つを持っていないことを祈ることを忘れないでください。例.coffee
Matthias Bauch、2015

1
@Antzi:「someone @ gmail」で確認したところ、正規表現はtrueを返しました。
ドンアン

2
正規表現は、ユーザーが電子メールアドレスを入力したことを検証するために機能しません。100%正しい唯一の方法は、アクティベーションEメールを送信することです。参照:RFCを読むまで電子メールアドレスを検証する方法を知っていました
mouviciel

2
これは魅力的なQAです。 ほとんどの場合、サイト全体で「最も間違った」QAです。 現在600票を獲得している#1の回答(何ですか?!)は、可能な限りすべてが完全に間違っています(すべての個別の行が完全に間違っており、すべての概念とアイデアが間違っています........ !!!)他の多くの投票された回答の多くは、「完全に間違っている」、「非常に不愉快」、または明白に壊れており、コンパイルさえしていません。さらに、このQの性質上、「エリート正規表現エンジニアリング」が必要ですが、多くの回答(投票数が多い!)には、並はずれた正規表現エンジニアリングが含まれています。本当に面白いQAです!! なぜ??
Fattie

回答:


769

私は使用しますNSPredicate

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

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

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

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

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

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

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

    if let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx) {
        return emailPred.evaluateWithObject(email)
    }
    return false
}

6
ではないでしょうreturn emailTest.evaluateWithObject(testStr)多くの単純で読み取り可能?と比較する== trueと、JavaScriptに少し似ています。
スルタン2014

15
利用可能な拡張があるかどうかはチェックしません
。a

6
これはtest @ test ... comに対しては検証されません
Alan

3
これはemail。@ invalid.comまたはemail @ .invalid.comを検出しません。@alexcristeaからの以下の答えはそうです
ベン・サリバン

3
…………だけでなく、(1)正規表現が完全に正しくない(2)正規表現(それがやろうとしていることのコンテキスト内であっても)に大きなエラー( 3)Swiftが間違っている(4)それを脇に置いても、スタイルは完全に間違っている(5)残りのすべてを考えると問題ではないが、述語をキャッシュする必要があるとは述べていません...ユーモラスに( 6)コピー元のコード(「カレンダー」-何ですか?)が残っています
Fattie、

115

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)

}

正常に動作しています。


2
有効な正規表現を持つ最初の。他のメンバーはaa @ aachをtrueに検証します
netshark1000 2016年

1
@ netshark1000、賛成票がある場合のみ、どの回答も上位になります。:)
Azik Abdullah 2016

NSRegularExpressionはNSPredicateよりも簡単に使用できます
Guillaume Laurent

1
ドメイン名の後の2つのドット条件は処理しません。この回答を試してくださいstackoverflow.com/a/53441176/5032981
Prashant Gaikwad

@AzikAbdullahはあなたが「ABC @ gmail..com」を入力した場合、その後もそれが検証します
NIJ

110

Stringクラス拡張として

SWIFT 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() {

}

4
countElementsis nowcount
ザックシャピロ2015

25
xxx @ yyyはtrueを返しますか?
カレンSUN

1
カレンSUNと同じように、foo @ barはtrueを返します。
レミーVirin

3
.tldのないuser @ hostも有効な電子メールアドレスです(例:root @ localhost
水曜日

1
NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

64

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

コードに簡単に統合できる電子メール検証述語が含まれています。

let email = "test@example.com"
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])+)\\])"

3
うわー、emailregex.comについて知りませんでした。すばらしい!
Samuel Ev 2016

2
最後に、email。@。email.comをフィルタリングするもの
Ben Sullivan

正確に動作します-abcd@abcd.com。abc @ abcを検証しない
Anil Gupta

あ、最後に..:D
Ümañgßürmån

39

ここに合理的な解決策があります:

「リーズナブルなソリューション」

多くの膨大な量のアプリで長年使用およびテストされています。

1- これらの提案でよく見られるひどい正規表現の間違いを回避します

2- 特定のRFCで有効であると考えられているが、完全にばかげている、電子メールとして使用できない、サポートスタッフが即座に拒否する「x @ x」などの愚かな電子メールは許可されません。メーラーサービス(mailchimp、google、awsなど)は単に拒否します。(何らかの理由で) 'x @ x'などの文字列を許可するソリューションが必要な場合は、別のソリューションを使用してください。

3-コードは非常に、非常に、非常に理解しやすい

4-それはKISSであり、信頼性があり、膨大な数のユーザーがいる商用アプリでの破壊がテストされています

5-技術的なポイント、述語はグローバルであり、Appleはそうすべきであると述べています(これがないコード提案に注意してください)

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である必要があります。(ただし、それはだOK:j@blah.com一つだけOCを持っているし、それはそれだ、など)

__serverpart ...「何とか」のようなセクションがあります。これの繰り返し。(したがって、mail.city.fcu.eduタイプのものです。)セクションはOCで開始および終了する必要がありますが、途中にダッシュ「-」を付けることもできます。(許可したい場合は、他のそこに異常な文字、おそらくアンダー、単にダッシュの前に追加します。)それのOKをちょうどある部分持っている1つの OCを。(joe@w.campus.eduと同様)セクションは5つまで作成できます、セクションを1つ作成する必要があります。最後に、TLD(.comなど)のサイズは厳密に2〜8 です。。明らかに、サポート部門の希望に応じて、その「8」を変更してください。


重要!

述語をグローバルとして保持する必要があります。毎回構築しないでください。

これは、アップルがドキュメント全体の問題について最初に言及したものであることに注意してください。

述語をキャッシュしない提案を見ると、それは非常に驚くべきことです。


1
.engineerのような新しいTLDをサポートしていますか?
ローマ

こんにちは@Roman-「最後にTLD(.comなど)は厳密に2〜8文字です」と明記されていることに注意してください。それで大丈夫です。「8」はお好みの値に変更できます。(今のところ、多くの大企業では、カスタマーサービスは長いTLDを単なる詐欺として拒否します-とにかく、それはあなたの決定です。「8」または好きな値を使用してください。)
Fattie

2
ポイント(4)に関して:多くのユーザーでどのようにテストしましたか?正規表現でユーザーがメールアドレスを使用できなかったために商用アプリにサインアップできなかったユーザーを追跡しましたか?唯一の「合理的」なものは、仕様(RFC)が指定するもの、またはこれが達成できない場合、より緩和されているが、仕様のすべてをカバーするものでなければなりません。ユーザーがx @ xの入力を許可されていない場合、ユーザーはgarbage@example.comを入力します。これにより、your / any正規表現が渡されます。
thetrutz

こんにちは@thetrutz、「garbage@example.com」はまったく通常のメールアドレスです。RFCには、「x @ x」のような理論的なイディオシーが含まれています。あなたまたは私が働いている実際の商用クライアントは、「それらを許可しない」と言います。(実際の大企業では、上記のRomanへのコメントで述べたように、ここでの大まかな概要よりもはるかに多くの制限があることに注意してください。)最後の文は混乱を招きます。もちろん、「機能しないメール」はローカルテスト?どういう意味ですか?当然のことながら、電子メールは最終的には「電子メールの確認」システムによってのみ検証されます。
Fattie

Swiftでは通常、サーバー側でこの言語を使用するため、すべてのプロセスを最適化する必要があります。
Nicolas Manzini、

25

以下は、最もよく投票された2つの回答と正しい正規表現の融合です:述語を使用した文字列拡張なので、string.isEmailを呼び出すことができます。

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

19

Swift 5で最も簡単な方法

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

"kenmueller0@gmail.com".isValidEmail

戻り値...

true

2
繰り返し答えを繰り返す意味は何ですか?Swift 5の機能に依存しない
rommex

17

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 "hodor@gameofthrones.com".isEmail { // true
    print("Hold the Door")
}

1
NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

Swift 4の更新:拡張文字列{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:count))return(firstMatch ?. range.location!= NSNotFound && firstMatch?.url?.scheme == "mailto")}
Duan Nguyen

15

これは、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
    }
}

8
foo @ barはtrueを返しますか?
レミーVirin

2
aa @ aachをtrueに検証します
netshark1000

4
これは、RFCがこれらの電子メールアドレスをtrueに検証するためです;)
dulgan

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

述語をキャッシュしないのは本当に間違っている/悪い。それはAppleがdocoの問題について最初に言うことです。ページのほとんどの回答で発生した重大な間違い。
Fattie、

9

ここには多くの正しい答えがありますが、「正規表現」の多くは不完全であり、「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
        }
    }
}

正しく機能しません。ドメインの後にスペースを追加できます。
ファンボエロ

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

@Fattieはあなたの声明を主張します。あなたのコメントは非常に役に立たず、改善を提案し、修正を提案します。完全に間違っていると言うことは非常に愚かであり、密接な考え方の根底にあります
Andrea.Ferrando

「ここには正しい答えがたくさんあります」その文は見事に間違っています:) :)
Fattie

8

これはに基づく方法です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-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])+)
     \])

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

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


1
使用するemailRegExはまったく間違っています。2〜4文字のTLDのみが許可されますが、などのドメインが.engineer存在します。
Antzi

理解しました。私は自分の答えを弁護するのではなく、編集のレベルを弁護します。上記のようにコメントを追加し、反対票を投じ、より適切な回答をポイントし、独自の回答を追加します。回答を大幅に変更することは適切ではありません。完全を期すために、拡散的なRegExを追加しました。
zaph

なぜああ、なぜ答えを削除しないのですか? ここに保管する理由でしょうか?
Fattie '15年

7

私はそのために拡張機能を使用することを好みます。さらに、この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)
    }
}

いくつかの問題がある..たとえば、.. blah @ .abcに奇妙なドットがある
Fattie

5

Swift 2.1の場合:これは電子メール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
        }
    }
}

1
これは私にとってはうまくいくようです。私が理解している限り、オプション.CaseInsensitiveを設定しているので、 'AZ'(大文字)を省略することもできます...
AZOM

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

5

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 
    {

    }

4

これは、@ 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 = "mail@domain.com"
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

簡単な拡張機能を作成します。

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

例:

"b@bb.pl".isValidEmail //true
"b@bb".isValidEmail //false

あなたが必要なものに次の拡張機能を拡張することができますisValidPhoneNumberisValidPassword等...


代わりにNSRange長さプロパティを使用する必要があることString utf16.countに注意してくださいcharacters.count
Leo Dabus

パターンは完全に間違っている
Fattie

2

スウィフト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
}

1

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

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

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

if(trial(evidence: "test@test.com")) {
   //email is valid
}

SwiftCopはライブラリです。役立つことを願っています!


1

これは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
}

alexcristeaの回答からRegexを使用するように変更すると、それは完璧なソリューションです。
ittgung 2017年

0

変なトップレベルドメイン名がたくさんあるので、トップドメインの長さのチェックを停止します...

これが私が使うものです:

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

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

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

回答@Arsonikの回答をSwift 2.2に更新し、他の提供されたソリューションよりも詳細なコードを使用しません。

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

abcd @ aはこの正規表現を使用しています。あなたはそれを修正する必要があります。
ガンハン2017

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

0

@JeffersonBeの答えは近いですがtrue、文字列が「someone@something.comの有効なメールを含むもの」である場合に返されます。以下は、うまく機能する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
}

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

0

そして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
    }
}

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

0

回答のリストへの私の唯一の追加は、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の両方で正常にコンパイルされます。


NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo

0

最良の結果をもたらす最良のソリューション

Swift 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

拡張機能を作成したい

   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

スウィフト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: "your@email.com")
print(validEmail)

0

Googleメールのような完璧な正規表現

"^[A-Z0-9a-z][a-zA-Z0-9_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"

2
私の答えに投票する人は誰でも、あなたの知識を親切にチェックしてください。私は多くのコードでこの正規表現を適用しており、私の友人はこの正規表現を使用していて、うまく機能します。私の投票に投票する前に、コメントをお願いし、この正規表現の何が問題かを知らせてください。
ami rt

私は答えられると思います:あなたの正規表現は単純で、RFCと一致しません。たとえば、メールの最初の部分に引用符やスペースを含めることができます。haacked.com/archive/2007/08/21/…を
Hugal31

1
申し訳ありません、兄弟、私はあなたがグーグルのメール検証をチェックするべきだと思います、メールの最初の部分にスペースを追加する方法はありません。
ami rt

RFC 5322によると、「Hello world!」@ example.comは有効なメールです。実際、有効な正規表現を作成することはほとんど不可能です。すべてのメールプロバイダーがGoogleのメール検証に固執するわけではありません。
Hugal31、2018年

1
それが私が聞きたいことであり、そのため、上記の正規表現はGoogleのようであると太字の見出しで述べました。ありがとう
ami rt

-1

または、UITextFieldのオプションテキストの拡張機能を使用できます。

使い方:

if  emailTextField.text.isEmailValid() {
      print("email is valid")
}else{
      print("wrong email address")
}

拡張:

extension Optional where Wrapped == String {
    func isEmailValid() -> Bool{
        guard let email = self else { return false }
        let emailPattern = "[A-Za-z-0-9.-_]+@[A-Za-z0-9]+\\.[A-Za-z]{2,3}"
        do{
            let regex = try NSRegularExpression(pattern: emailPattern, options: .caseInsensitive)
            let foundPatters = regex.numberOfMatches(in: email, options: .anchored, range: NSRange(location: 0, length: email.count))
            if foundPatters > 0 {
                return true
            }
        }catch{
            //error
        }
        return false
    }
}

NSRangeの長さプロパティは、characters.countではなくString utf16.countを使用する必要があることに注意してください
Leo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.