2013-04-05 100 views
0

我有以下方法来验证我的电子邮件地址在窗体中。如何验证“。”在电子邮件地址?

-(BOOL) validEmailAddress:(NSString*) emailString { 
    NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+.[A-Z]{2,4}$"; 
    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil]; 
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])]; 
    if (regExMatches == 0) 
     return NO; // email invalid 
    else 
     return YES; // email valid 
    } 

这个伟大的工程,除了它打破了如果用户给出“ABC @ XYZ”的电子邮件(不象.com或.org超级域)。

我很确定问题与“。”有关。在我的正则表达式中。我试图像这样逃脱它,

NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$"; 

但这也行不通。有什么建议么?

编辑:当最初发布问题时,我没有在最后一个点之前进行转义。抱歉。

+1

你是什么意思*分解*?您的功能是否将'abc @ xyz'视为有效的电子邮件地址?如果是这样,那很好,因为'abc @ xyz' *是一个有效的电子邮件地址。 – Oswald 2013-04-05 22:51:42

+0

您可能需要查看http://www.regular-expressions.info/email.html关于验证具有正则表达式的电子邮件的其他提示 – david 2013-04-05 22:57:10

+1

和http://data.iana.org/TLD/tlds -alpha-by-domain.txt查看有效顶级域名列表 – david 2013-04-05 23:06:14

回答

0

我没有看到你的最后一个例子转义序列完成。尝试:

NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$"; 
+0

我试着用一个反斜杠,它不起作用,加上编译器抱怨它不是一个公认的转义序列。所以你必须避开这个小点并且避开反斜杠?我现在正在尝试。 – 2013-04-06 00:22:58

+0

@ Justin-NicholasY.Toyama是的,这是一个奇怪的正则表达式怪癖。由于\是一个你可能希望包含在你的正则表达式中的字符,所以你必须将它加倍以表明它是一个转义序列。 \。意思是“斜线后跟任何字符”(因为。是通配符),而\\。意味着一个字面点。 – 2013-04-06 01:24:50

+0

谢谢,比尔。您的解决方案对于我正在努力完成的任务而言令人满意 – 2013-04-06 01:44:56

0

你必须逃避最后一个点。因此,你的表达是:

^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$ 

然而,由于\也被Objective C的解释为转义字符,你将不得不逃避它。这在客观C利用双反斜线(\\

NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$"; 
+0

我试过了。这不起作用。比尔蜥蜴的代码工程,虽然我不知道为什么。 – 2013-04-06 00:27:36

+0

实际的正则表达式只有一个反斜杠。然而,'\'也被解释为Objective C中的转义字符,并且需要在那里转义以及最终导致它们中的2个。 – david 2013-04-06 06:14:17

0

您需要转义点,是的。

要接受“abc @ xyz”,您还需要将点和其后的所有内容都设为可选。你可以通过将它封装在圆括号中,然后用一个问号来做到这一点,如:

^[A-Z0-9._%+-][email protected][A-Z0-9.-]+(\.[A-Z]{2,4})?$ 
+0

如果@ Oswald的评论是正确的,那么如果它有效,这是一个很好的实现。我会检查出来的。谢谢。 – 2013-04-06 00:29:01

+1

@ Justin-NicholasY.Toyama为了增加一点复杂性,如果你想要接受任何有效的电子邮件地址,这是无法详尽无遗的,正如维基百科的[有效电子邮件地址示例](http: //en.wikipedia.org/wiki/Email_address#Valid_email_addresses) – femtoRgon 2013-04-06 00:59:18

相关问题