NSRegularExpression验证电子邮件

时间:2011-11-19 23:51:56

标签: ios regex cocoa

我想使用NSRegularExpression类来验证NSString是否是电子邮件地址。

像这样的伪代码:

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

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

但我不知道我是如何验证NSString的,如果它看起来像这个“email@stackoverflow.com”

也许有人可以帮助我。

问候 s4lfish

3 个答案:

答案 0 :(得分:31)

您可以使用:

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

你可以在这里测试一下:

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

并保存此链接,它将在未来帮助您使用Regex:

http://gskinner.com/RegExr/

修改

你可以这样做:

 NSString *string = @"shlaflaf@me.com";
 NSString *expression = @"^[A-Z0-9a-z._%+-]+@[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");
    }

答案 1 :(得分:8)

这是一个较老的问题,但它足够通用,永远不会过时。

99.9%的电子邮件地址正则表达式错误,甚至更少处理国际域名(IDN)。

尝试制作全面的电子邮件正则表达式并不能很好地利用开发时间或用户CPU周期。

这更简单:

  1. 匹配[^@]+@([^@]+)

  2. 根据匹配的部分提取域名。

  3. 如果与禁止的域匹配则失败。从JSON端点本地缓存禁止域列表,这样您就不必等待重新批准,并且可以即时更新它。 (请务必记录转化分析的网络统计信息。)

  4. 检查域是否有DNS记录。检查A和AAAA,以及MX,因为并非所有域都实现MX。 (Lame但是真的。)

  5. 只是尝试发送电子邮件。如果用户认为某个应用具有价值,则会再次尝试。 :))

答案 2 :(得分:1)

Swift 4版本

我正在为那些正在为电子邮件正则表达式做Swift 4版本的人写这篇文章。 以上可以完成:

 do {
        let emailRegex = try NSRegularExpression(pattern: "^[A-Z0-9a-z._%+-]+@[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
    }

假设电子邮件是一个快速的字符串类型。