【发布时间】:2017-06-12 18:26:24
【问题描述】:
我在我的项目中使用电子邮件验证,方法如下所示
//MARK: isValidEmailID
func isValidEmail(testStr:String) -> Bool {
print("validate emilId: \(testStr)")
let emailRegEx = "^(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?(?:(?:(?:[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?: )*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?: )*)|(?: )+)\"))(?:@)(?:(?:(?:[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)(?:\\.[A-Za-z0-9](?:[-A-Za-z0-9]{0,61}[A-Za-z0-9])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?: )*[!-Z^-~])*(?: )*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?$"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
let result = emailTest.evaluateWithObject(testStr)
return result
}
或
func isValidEmailID(email: String) -> Bool {
let regExPattern: String = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let emailValidator: NSPredicate = NSPredicate(format: "SELF MATCHES %@", regExPattern)
let isValid: Bool = emailValidator.evaluateWithObject(email)
return isValid
}
当我输入“modijecky@gmail.com”或任何其他错误输入时,这两个正则表达式都可以正常工作,但当我输入“modijecky@gmail.com.com”时它不会工作。
所以,我发现“name@.com.com”是一个有效的电子邮件地址,并且有更多这样的子域。所以现在我希望用户不要输入子域。是否有任何 REGEX 仅在一个域中验证电子邮件地址,例如“name@gmail.com”,而不是多个域或子域。
我还尝试了来自谷歌的不同正则表达式并将其实施到项目中,但出现了同样的问题。
请帮帮我。
谢谢
【问题讨论】:
-
为什么
modijecky@gmail.com.com应该是错误的?com.com和gmail.com.com一样是有效域。见:en.wikipedia.org/wiki/Email_address#Examples -
验证电子邮件的唯一安全方法是发送电子邮件并等待返回。
-
请查看我更新的答案
标签: ios regex swift email-validation