我使用以下正则表达式进行电子邮件验证:
NSString *emailRegEx = @"([0-9a-zA-Z]([-.[A-Za-z0-9_]]*[0-9a-zA-Z_])*@([0-9a-zA-Z][-[A-Za-z0-9_]]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})";
NSPredicate *emailRegexPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", firstPartRegex];
return [emailRegexPredicate evaluateWithObject:input]
我遇到的问题是,当我输入一封在@
符号前面有大约20-25个字符的无效电子邮件时,iPhone就会挂起。
例如,电子邮件地址"Abcdefghijklmnopqrstuvwxyz@gmail"
会导致iPhone挂起。
但是"Abcdefghijklmnopqrstuvwxyz@gmail.com"
会正常验证。 "Abcdefghijklmnopqrst@gmail"
会立即返回无效。
我注意到大约20个字符,正则表达式返回无效需要更长的时间,然后递增1个字符似乎会以指数方式变长。
似乎它与表达式的这一部分有关:
([-.[A-Za-z0-9_]]*[0-9a-zA-Z_])*
但我无法想出一个可以得到相同结果的替代方案。
有什么想法吗?
答案 0 :(得分:3)
a project on github有一个经过严格测试的电子邮件正则表达式 - 很难自己制作 - 请参阅this link on testing various patterns。该项目有一个方法isValidEmail
,你可以迭代调用(比如用户点击信息),这样你就可以启用一个提交按钮等。
您可以在this previous answer。
中详细了解该问题和其他解决方案 编辑:似乎regEx中的歧义可能导致需要无限时间才能解决的周期。自从发布这个答案以来,我一直致力于“近乎完美”的regEx验证电子邮件,所有这些都基于标准。 github项目也已更新,验证RegEx是:@“^(?:(?:(?:( ?:)(?:(?:(?:\ t |) \ r \ n)?(?:\ t |)+))+(?:))|(?: ????!?)+)(:(:(:[ - A-ZA-Z0-9#$%&安培;' + / = ^
{|}~]+(?:\\.[-A-Za-z0-9!#$%&'*+/=?^_
{|}〜 ] +)*)|(?:???\“(:( :( :( ?: )*(?:(?:[!# - Z ^ - 〜] | \ [| \])|(?:\\(?:\ t | [ - 〜]))))+(?:)* )|(?: )+)\“))(:@)(:( :( ?: A-ZA-Z0-9)(:??????\ A-ZA-Z0-9)*)|(?: \ [(:(:(:(:(:[0-9] |(:?????[1-9] [0-9])|(?:λ1 [0-9] - [O- 9])|(:2 [0-4] [0-9])|(?:25 [0-5]))\){3}(:[0-9] |(?:?[ 1-9] [0-9])|(1:1 [0-9] [0-9])|(?:2 [0-4] [0-9])|(?:?25 [O- 5))))|?(:( :( ?: )* [! - Z 1 - 〜)*(?: )*)|(?:![VV] [0-9A-发-F] + \ [ - A-ZA-Z0-9 〜$&安培;'() + ,; =:???] +))\])))(:( :( :( ?: )(?:(?:(?:\ t |) \ r \ n)?(?:\ t |)+))+(?:))|(? :)+)?$“