NSRegularExpressionvalidation电子邮件
我想使用NSRegularExpression
类来validationNSString
是否是电子邮件地址。
像这样的伪代码:
- (BOOL)validateMail : (NSString *)email { NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"" options:NSRegularExpressionCaseInsensitive error:NULL]; if(emailValidated) { return YES; }else{ return NO; } }
但我不知道我是如何validationNSString的,如果它看起来像这个“email@stackoverflow.com”
也许有人可以帮助我。
问候s4lfish
您可以使用:
@"^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$"; // Edited: added ^ and $
你可以在这里测试一下:
http://gskinner.com/RegExr/?2rhq7
并保存此链接,它将在未来帮助您使用Regex:
编辑
你可以这样做:
NSString *string = @"shannoga@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"); }
这是一个较老的问题,但它足够通用,永远不会过时。
99.9%的电子邮件地址正则表达式是错误的,甚至更少处理国际域(IDN)正确。
尝试制作全面的电子邮件正则表达式并不能很好地利用开发时间或用户CPU周期。
这更简单:
-
匹配
[^@]+@([^@]+)
-
根据匹配的部分提取域。
-
如果它与禁止的域匹配则失败。 从JSON端点本地缓存禁止域列表,这样您就不必等待重新批准并可以即时更新它。 (请务必记录网络统计信息以进行转换分析。)
-
检查域是否有DNS记录。 检查A和AAAA,以及MX,因为并非所有域都实现MX。 (Lame但是真的。)
-
只是尝试发送电子邮件。 如果用户认为某个应用具有价值,则会再次尝试。 :))
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 }
假设电子邮件是一个快速的字符串类型。