我正在寻找在Swift中验证电子邮件(String)的最简单,最干净的方法。在Objective-C中我使用了这个方法,但是如果我将它重写为Swift,则在创建谓词时会出现“无法解析格式字符串”的错误。
- (BOOL) validateEmail: (NSString *) candidate {
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:candidate];
}
答案 0 :(得分:37)
看起来很简单。如果您在使用Swift转换时遇到问题,那么查看您实际尝试的内容可能会有所帮助。
这对我有用:
func validateEmail(candidate: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate)
}
validateEmail("test@google.com") // true
validateEmail("invalid@@google.com") // false
答案 1 :(得分:6)
Swift 3.0版本
func validateEmail(candidate: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: candidate)
}
validateEmail("test@google.com") // true
validateEmail("invalid@@google.com") // false
答案 2 :(得分:2)
extension String
{
func isEmail() -> Bool
{
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(self)
}
}
答案 3 :(得分:1)
以下是适用于每个电子邮件域的扩展程序。
例如:.com
,.co.uk
,.co.in
等
extension String {
func isValidEmail() -> Bool {
let emailRegEx = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[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])?)*$"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluateWithObject(self)
}
}
答案 4 :(得分:1)
在这里投入我的2美分用曲线球打你:
您真的想要验证您的电子邮件地址吗?
请参阅此blogpost,其中建议您检查电子邮件是否有效需要做的就是检查它是否有@
符号,或者最多只有@
后跟一个.
/.+@.+\..+/i
:
(?:[a-zA-Z_][a-zA-Z0-9_]*|\.\.\.|,\s*)*
答案 5 :(得分:0)
class func isValidEmail(email:String)-> Bool
{
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
var emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
let result = emailTest!.evaluateWithObject(email)
return result
}
答案 6 :(得分:0)
Craigs回答有效,如果有人正在努力实现它,这里是用textFieldDidEndEditing函数调用它。 (需要UITextFieldDelegate)
func textFieldDidEndEditing(textField: UITextField)
{
if validateEmail(emailAddress.text)
{
println("valid")
}
else
{
println("NOT valid")
}
}
func validateEmail(candidate: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluateWithObject(candidate)
}
答案 7 :(得分:0)
Swift 4只需设置:
extension String {
var isEmail: Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: self)
}
}
添加
UITextFieldDelegate
在viewDidLoad中:
yourTextField.delegate = self
用法:
func textFieldDidEndEditing(_ textField: UITextField) {
guard let validEmailAddress = yourTextFiled.text else { return }
if !(validEmailAddress.isEmail) {
//is invalid address
} else {
//is valid address
}
}
答案 8 :(得分:0)
我使用NSDataDetector API。这里的许多答案都不支持电子邮件地址中允许使用的字符,例如'
。
extension String {
var isEmail: Bool {
let dataDetector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)
let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: count))
return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
}
}
例如
"foo@bar.com".isEmail // true
"foo.mc'doo@foo-bar.com".isEmail // true
我还使用了来自Android SDK的正则表达式,效果很好:
[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}\\@[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}(\\.[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25})+
为什么Apple不只是在String上包含用于电子邮件验证的方法,这还是一个谜。
答案 9 :(得分:-1)
Region Sales Cost
North 139 35
South 786 295
South 312 117
East 288 108
North 149 56
West 508 127
North 145 54
South 379 142
East 500 188