电子邮件地址的正则表达式不起作用
Posted
技术标签:
【中文标题】电子邮件地址的正则表达式不起作用【英文标题】:Regex for an email address doesn't work 【发布时间】:2010-07-05 13:29:44 【问题描述】:我正在尝试使用以下代码检查某些电子邮件地址是否正确:
NSPredicate *regexMail = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"];
if([regexMail evaluateWithObject:someMail])
...
但是“\.”由于接受了邮件“smith@company”,因此似乎不起作用。此外,我有以下警告:“未知转义序列”
编辑:
我正在为 iPhone 使用 Objective-C 编程。
谢谢
【问题讨论】:
您使用的是什么正则表达式库?哪种编程语言? 对不起,我忘了提到 xD 它是用于 iPhone 编程的 Objective-C。 除了将电子邮件地址与正则表达式匹配非常困难之外,没有理由必须使用 .之后 @。例如,postmaster@com 可能是一个有效的电子邮件地址。 What is the best regular expression for validating email addresses? 的可能重复项 【参考方案1】:这是 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];
【讨论】:
john.doe@yahoo
对这个有效
糟糕,好消息!我忘了用\.
转义.
正则表达式现已修复。
我的正则表达式非常糟糕,所以我一直在寻找“准备使用”的正则表达式。但是这个(使用 NSPredicate 正则表达式实现)有一个主要问题:尝试验证这个字符串:@“asdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdfasdkfjaskdjfakljsdf”你会看到它永远不会结束。【参考方案2】:
您无法仅使用正则表达式正确验证电子邮件地址。一个简单的search 将向您展示许多讨论此问题的文章。问题在于 DNS 的性质:可能的域名太多(包括非英语和 Unicode 域),您无法使用正则表达式正确验证它们。不要尝试。
确定电子邮件地址是否有效的唯一正确方法是向该地址发送一条带有唯一 URL 的消息,该 URL 标识与电子邮件关联的帐户,供用户点击。其他任何事情都会惹恼您的最终用户。
【讨论】:
是的,你说得对,我只是想做一个简单的检查,看看邮件是否看起来像带有“@”和“.”的“name@company.com” 在这种情况下,..*[@]..*[.]..*
应该可以满足您的需求。我使用..*
来匹配至少一个字符,因为.+
虽然更直接,但并非所有RegEx 库都支持。我使用[@]
和[.]
,因为它们将匹配单个字符,而无需处理反斜杠和双反斜杠来转义单个字符。【参考方案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
【讨论】:
这里的字符“。”仍然存在同样的问题。 "johndoe@example" 匹配但不应该匹配。【参考方案4】:我猜应该是\\.
,因为\
本身也应该被转义。
【讨论】:
已经尝试过了,警告消失了,但正则表达式无论如何都不起作用。将尝试下面的正则表达式。谢谢【参考方案5】:这个页面很好地解释了使用正则表达式来验证电子邮件,以及一些正则表达式:
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])?似乎是彻底性和正确性之间的最佳权衡。
【讨论】:
这不考虑大写字母?【参考方案6】:试着用双斜线代替一个斜线。这就是未知转义序列的含义。
这里有一个网站可以帮助你了解如何使用正则表达式:http://www.wellho.net/regex/java.html
或者只是在这里为电子邮件地址找到适当的正则表达式: http://regexlib.com/DisplayPatterns.aspx?cattabindex=0&categoryId=1
【讨论】:
【参考方案7】:我认为您正在寻找this。它是一个非常全面的不同正则表达式列表和每个邮件地址的列表,说明正则表达式是否成功。
【讨论】:
【参考方案8】:复制粘贴解决方案(我为第一个示例添加了大写字母):
如果我们省略 使用双引号和方括号的语法。它仍然会匹配 今天实际使用的所有电子邮件地址的 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进行测试
【讨论】:
以上是关于电子邮件地址的正则表达式不起作用的主要内容,如果未能解决你的问题,请参考以下文章