2

我正在尝试使用以下代码检查某些电子邮件地址是否正确:

NSPredicate *regexMail = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"];
if([regexMail evaluateWithObject:someMail])
... 

但是“\。” 由于接受了邮件“smith@company”,因此似乎不起作用。此外,我有以下警告:“未知转义序列”

编辑 :

我正在为 iPhone 使用 Objective-C 编程。

谢谢

4

8 回答 8

13

这是 iOS 邮件应用程序用来验证电子邮件地址的正则表达式:

^[[:alnum:]!#$%&’*+/=?^_`{|}~-]+((\.?)[[:alnum:]!#$%&’*+/=?^_`{|}~-]+)*@[[:alnum:]-]+(\.[[:alnum:]-]+)*(\.[[:alpha:]]+)+$

下面是一个复制/粘贴准备好的函数,它使用这个正则表达式来验证 Objective-C 中的电子邮件地址:

BOOL IsValidEmail(NSString *email)
{
    // Regexp from -[NSString(NSEmailAddressString) mf_isLegalEmailAddress] in /System/Library/PrivateFrameworks/MIME.framework
    NSString *emailRegex = @"^[[:alnum:]!#$%&'*+/=?^_`{|}~-]+((\\.?)[[:alnum:]!#$%&'*+/=?^_`{|}~-]+)*@[[:alnum:]-]+(\\.[[:alnum:]-]+)*(\\.[[:alpha:]]+)+$";
    NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailPredicate evaluateWithObject:email];
}
于 2012-01-14T17:08:11.447 回答
6

您无法仅使用正则表达式正确验证电子邮件地址。一个简单的搜索将向您展示许多讨论此问题的文章。问题在于 DNS 的性质:可能的域名太多(包括非英语和 Unicode 域),您无法使用正则表达式正确验证它们。不要尝试。

确定电子邮件地址是否有效的唯一正确方法是将消息发送到具有唯一 URL 的地址,该 URL 标识与电子邮件关联的帐户,供用户单击。其他任何事情都会惹恼您的最终用户。

于 2010-07-05T14:00:06.853 回答
3

这是一个工作示例,具有稍微更合适的模式(尽管它并不完美,正如其他人所提到的):

NSString* pattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
if ([predicate evaluateWithObject:@"johndoe@example.com"] == YES) {
  // Match
} else {
  // No Match
}
于 2010-07-05T14:59:40.237 回答
2

我想它应该是\\.,因为\它本身也应该被转义。

于 2010-07-05T13:31:40.580 回答
2

这个页面很好地解释了使用正则表达式来验证电子邮件,以及一些正则表达式:

http://www.regular-expressions.info/email.html

他们的表达:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^ _`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a- z0-9](?:[a-z0-9-]*[a-z0-9])?

似乎是彻底性和正确性之间的最佳权衡。

于 2010-07-05T13:34:27.360 回答
0

尝试使用双斜线而不是一个斜线。这就是未知转义序列的含义。

这是一个可以帮助您了解如何使用正则表达式的网站:http ://www.wellho.net/regex/java.html

或者在这里为电子邮件地址找到适当的正则表达式: http ://regexlib.com/DisplayPatterns.aspx?cattabindex=0&categoryId=1

于 2010-07-05T13:44:35.353 回答
0

我想你正在寻找这个。它是一个非常全面的不同正则表达式列表和每个邮件地址的列表,说明正则表达式是否成功。

于 2010-07-05T14:04:27.427 回答
0

复制粘贴解决方案(我为第一个示例添加了大写字母):

如果我们省略使用双引号和方括号的语法,我们将获得更实用的 RFC 5322 实现。它仍将匹配当今实际使用的所有电子邮件地址的 99.99%。来源

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
  NSString * derivedStandard = @"[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?";
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", derivedStandard];
  BOOL isValid = [predicate evaluateWithObject:emailAddress];

//doesn't fail on ;)
@"asdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdf"

对于那些想要实现完整 RFC5322 的人

官方标准称为 RFC 5322。它描述了有效电子邮件地址必须遵守的语法。您可以(但您不应该继续阅读)使用这个正则表达式来实现它:

(?:[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])+)\])
  NSString *rfc5322 = @"(?:[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])+)\\])";
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", rfc5322];
  BOOL isValid = [predicate evaluateWithObject:emailAddress];

以上正则表达式,您可以使用在线正则表达式测试器进行测试

于 2015-09-23T21:55:03.433 回答