使用NSScanner验证和提取电子邮件地址?

时间:2014-01-04 08:59:40

标签: cocoa email nsscanner

关于如何使用正则表达式和/或JavaScript等验证电子邮件地址有几个问题。我还读到了一个Cocoa类NSScanner,它应该进行解析。这种用法很奇怪,但我确实读过让程序员用NSScanner检查CSV文件的页面。
NSScanner可以处理电子邮件地址语法吗?

(如果可能,为了更有用,代​​码不仅可以验证,还可以提供一种方法来提取:本地部分,域,可读用户名(如果有的话)和任何注释)

1 个答案:

答案 0 :(得分:1)

如何使用更现代的NSRegularExpression OS X v10.7 +,iOS 4.0 + ):

- (BOOL) isValidEmail:(NSString*) emailString
{
   // valid email address according to RFC 2822
   // Check http://www.cocoawithlove.com/2009/06/verifying-that-string-is-email-address.html
   NSString *emailRegEx =
   @"(?:[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])+)\\])";

   NSError *error = nil;
   NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:emailRegEx
                                                                          options:NSRegularExpressionCaseInsensitive
                                                                            error:&error];
   if (error != nil)
      return NO;

   NSRange stringRange = NSMakeRange(0, emailString.length);
   NSRange matchRange = [regex rangeOfFirstMatchInString:emailString options:0 range:stringRange];

   return NSEqualRanges(matchRange, stringRange);
}

另请查看this CocoaWithLove博客文章(2009年,但仍然大部分有效),以便进行更详细的讨论。