我在项目中使用电子邮件验证,方法如下
//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”)中的电子邮件地址,而不能包含多个域或子域。
我也尝试使用与Google不同的Regex并将其实施到项目中,但是会发生相同的问题。
请帮我。
谢谢
最佳答案
不要重新发明轮子:
Not Reinventing the Wheel: Email Validation in Swift
基本上,您可以使用 NSDataDetector
进行繁重的工作,并使所有内容保持一致并更新为它在macOS和iOS本机中的工作方式。不仅如此,您还可以避免正则表达式的头痛。
// Simplifying the example from the website a bit
import Foundation
func validate(_ text: String) -> Bool {
let types = NSTextCheckingResult.CheckingType.link.rawValue
guard
let dataDetector = try? NSDataDetector(types: types),
let match = dataDetector
.matches(in: text, options: [], range: NSRangeFromString(text))
.first,
let absoluteString = match.url?.absoluteString
else { return false }
return absoluteString == "mailto:\(text)"
}
validate("test@gmail.com") // -> true
validate(" test@gmail.com") // -> false
这样可以确保整个文本是一个有效的电子邮件地址,没有多余的字符。