电子邮件地址的正则表达式不起作用

时间:2010-07-05 13:29:44

标签: iphone objective-c regex email nspredicate

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

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

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

编辑:

我正在使用Objective-C for iPhone进行编程。

由于

8 个答案:

答案 0 :(得分:13)

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

^[[: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];
}

答案 1 :(得分:6)

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

确定电子邮件地址是否有效的唯一正确方法是向地址发送邮件,其中包含标识与电子邮件关联的帐户的唯一URL,供用户单击。其他任何东西都会惹恼你的最终用户。

答案 2 :(得分: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
}

答案 3 :(得分:2)

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

答案 4 :(得分: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])?

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

答案 5 :(得分:0)

尝试使用双斜杠而不是斜杠。这就是未知转义序列的意思。

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

  

如果我们省略,我们会得到更实际的RFC 5322   语法使用双引号和方括号。它仍然会匹配   今天实际使用的所有电子邮件地址的99.99%。 Source

[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];

以上正则表达式,您可以使用在线正则表达式tester

进行测试