2011-11-19 8 views
9

NSRegularExpressionクラスを使用して、NSStringが電子メールアドレスであるかどうかを検証したいと考えています。NSRegularExpression

この擬似コードのようなもの:

- (BOOL)validateMail : (NSString *)email 
{ 
    NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"" options:NSRegularExpressionCaseInsensitive error:NULL]; 

    if(emailValidated) 
    { 
     return YES; 
    }else{ 
     return NO; 
    } 
} 

しかし、それはこの1つのように見ている場合、私はNSStringのを検証する方法を正確に知らない「[email protected]

おそらく誰かが私を助けることができますここに。

挨拶を使用でき s4lfish

答えて

31

@"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 

あなたはここでそれをテストすることができます。

http://gskinner.com/RegExr/?2rhq7

そして、このリンクを保存することは、将来的に正規表現をお届けします:

http://gskinner.com/RegExr/

あなたはこのようにそれを行うことができますEDIT

NSString *string = @"[email protected]"; 
NSString *expression = @"^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added^and $ 
NSError *error = NULL; 

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error]; 

    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])]; 

    if (match){ 
     NSLog(@"yes"); 
    }else{ 
     NSLog(@"no"); 
    } 
+2

うわーだよね。 –

+0

おかげで、私の問題は、入力した電子メールが正規表現に合っていることを証明する関数が見つからないということです。私はリンゴのドキュメントを見てきましたが、何とかNSRegularExpressionは私の "if文"のブール値を返す関数を持っていません。 – s4lfish

+2

こんにちは私はそのためのコードサンプルを追加しました。あなたがあなたのコメントを説明できるなら、BTW @Alex Nicholは素晴らしいことになるでしょう。私は私の答えで間違っているかもしれないが、あなたのコメントは私を助けてくれないか、他の誰かがこの問題をよりよく理解していません。 – shannoga

8

これは、古い問題だったが、それは、スタイルの外に出たことがないのに十分な一般的です。

電子メールアドレスの正規表現の99.9%が間違っており、国際ドメイン(IDN)を正しく処理できません。

総合的な電子メールの正規表現を作成しようとすると、開発時間やユーザーのCPUサイクルがうまくいかないことがあります。

これははるかに簡単です:

  1. マッチ[^@][email protected]([^@]+)

  2. がマッチした部分ごとにドメインを抽出します。

  3. 禁止ドメインと一致すると失敗します。禁止ドメインのリストをJSONエンドポイントからローカルにキャッシュして、再承認を待つ必要がなく、オンザフライで更新することができます。

  4. ドメインにDNSレコードがあることを確認してください。すべてのドメインでMXが実装されているわけではないため、MXに加えてAとAAAAも確認してください。 (ラメだけど真実。)

  5. ちょうどすでに電子メールを送信しようとします。ユーザーは、アプリに価値があると認識した場合に再試行します。 :))

+0

が同意すると、トップレベルドメインは 'community'、' properties'など、4つ以上のドメインにすることができます。厳格なものは何のものより悪いです。 – chao787

0

スウィフト4バージョン

私は、電子メールの正規表現のためにスウィフト4バージョンをやっている人のためにこれを書いています。 以下のように行うことができます。

do { 
     let emailRegex = try NSRegularExpression(pattern: "^[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$", options: .caseInsensitive) 
     let textRange = NSRange(location: 0, length: email.count) 
     if emailRegex.firstMatch(in: email, options: [], range: textRange) != nil { 
      //Do completion code here 
     } else { 
      //Do invalidation behaviour 
     } 
    } catch { 
     //Do invalidation behaviour 
    } 

と仮定すると、電子メールが入力された迅速な文字列です。