NSRegularExpression验证电子邮件地址

10
我希望使用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


有时候你只需要简单的 ^[^@]+@[^@]+\.[^@]+$ - Timur Bernikovich
3个回答

31

您可以使用:

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

你可以在这里进行测试:

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

同时,保存这个链接将有助于你以后使用正则表达式:

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

谢谢,但我的问题是我找不到一个函数来证明输入的电子邮件符合正则表达式。我已经查看了苹果的文档,但不知何故NSRegularExpression没有一个函数可以为我的“if语句”返回布尔值。 - s4lfish
2
嗨,我已经添加了一个代码示例。顺便说一句,@Alex Nichol,如果您能解释一下您的评论,那就太好了。也许我的答案是错误的,但是您的评论并没有帮助我或其他人更好地理解这个问题。 - shannoga
2
该表达式不符合RFC 822标准。 - Sofi Software LLC
1
你忘记在模式中转义“\”了。在NSRegularExpression模式中,@"\."会被解释为“.”,也就是匹配任何字符。如果你的意图是仅匹配字面上的“.”,那么你需要使用@"\\." - jemmons

9

这是一个旧问题,但它足够普遍,永远不会过时。

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

试图制作一个全面的电子邮件正则表达式并不是开发时间或用户CPU周期的好用途。

这就简单多了:

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

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

  3. 如果它匹配了被禁止的域名,则失败。 从JSON端点本地缓存被禁止的域名列表,以便您不必等待重新批准,并且可以实时更新它。(一定要记录网络统计数据进行转化分析。)

  4. 检查该域是否具有DNS记录。 除了MX之外还要检查A和AAAA,因为并非所有域都实现了MX。(很懒但却是真的。)

  5. 尝试发送电子邮件。 如果用户认为应用程序有价值,他们将再次尝试。 :))


同意,顶级域名可以超过4个字符,例如communityproperties。过于严格不如没有。 - chao787

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
    }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接