正则表达式挂在iPhone电子邮件验证

时间:2013-05-13 20:37:27

标签: ios objective-c regex

我使用以下正则表达式进行电子邮件验证:

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_])*

但我无法想出一个可以得到相同结果的替代方案。

有什么想法吗?

1 个答案:

答案 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 |)+))+(?:))|(? :)+)?$“