首页 文章

如何在swift中验证电子邮件地址?

提问于
浏览
265

有谁知道如何在Swift中验证电子邮件地址?我找到了这段代码:

- (BOOL) validEmail:(NSString*) emailString {

    if([emailString length]==0){
        return NO;
    }

    NSString *regExPattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";

    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])];

    NSLog(@"%i", regExMatches);
    if (regExMatches == 0) {
        return NO;
    } else {
        return YES;
    }
}

但我不能把它翻译成斯威夫特 .

30 回答

  • -1

    我会用 NSPredicate

    func isValidEmail(testStr:String) -> Bool {        
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    
        let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return emailTest.evaluate(with: testStr)
    }
    

    对于早于3.0的Swift版本:

    func isValidEmail(testStr:String) -> Bool {
        // print("validate calendar: \(testStr)")
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    
        let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return emailTest.evaluate(with: testStr)
    }
    

    对于早于1.2的Swift版本:

    class func isValidEmail(testStr:String) -> Bool {
        println("validate calendar: \(testStr)")
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    
        if let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) {
            return emailTest.evaluateWithObject(testStr)
        }
        return false
    }
    
  • 0

    作为 String 类扩展

    SWIFT 4

    extension String {
        func isValidEmail() -> Bool {
            // here, `try!` will always succeed because the pattern is valid
            let regex = try! NSRegularExpression(pattern: "^[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])?)*$", options: .caseInsensitive)
            return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
        }
    }
    

    用法

    if "rdfsdsfsdfsd".isValidEmail() {
    
    }
    
  • -1

    编辑,更新为Swift 3:

    func validateEmail(enteredEmail:String) -> Bool {
    
        let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
        return emailPredicate.evaluate(with: enteredEmail)
    
    }
    

    Swift 2的原始答案:

    func validateEmail(enteredEmail:String) -> Bool {
    
        let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
        return emailPredicate.evaluateWithObject(enteredEmail)
    
    }
    

    它工作正常 .

  • 0

    由于现在有这么多奇怪的顶级域名,我停止检查顶级域名的长度...

    这是我使用的:

    extension String {
    
        func isEmail() -> Bool {
            let emailRegEx = "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$"
            return NSPredicate(format:"SELF MATCHES %@", emailRegEx).evaluateWithObject(self)
        } 
    }
    
  • 0

    似乎也工作......

    let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
    
    func validate(email: String) -> Bool {
        let matches = email.rangeOfString(regex, options: .RegularExpressionSearch)
        if let _ = matches {
            return true
        }
        return false
    }
    
  • 0

    如果您正在寻找一个干净而简单的解决方案来执行此操作,您应该查看https://github.com/nsagora/validation-components .

    它包含一个电子邮件验证谓词,可以轻松集成到您的代码中:

    let email = "test@example.com"
    let rule = EmailValidationPredicate()
    let isValidEmail = rule.evaluate(with: email)
    

    在引擎盖后面它使用RFC 5322 reg ex(http://emailregex.com):

    let regex = "(?:[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[\\p{L}0-9!#$%\\&'*+/=?\\^_`{|}" +
        "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
        "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[\\p{L}0-9](?:[a-" +
        "z0-9-]*[\\p{L}0-9])?\\.)+[\\p{L}0-9](?:[\\p{L}0-9-]*[\\p{L}0-9])?|\\[(?:(?:25[0-5" +
        "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
        "9][0-9]?|[\\p{L}0-9-]*[\\p{L}0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
        "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"
    
  • 42

    以下是使用谓词进行字符串扩展的两个最高投票答案的融合:所以你可以调用string.isEmail

    extension String {
            var isEmail: Bool {
               let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,20}"            
               let emailTest  = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
               return emailTest.evaluateWithObject(self)
            }
        }
    
  • 1

    这是合理的解决方案:

    “合理的解决方案”

    在许多大批量应用程序中使用和测试多年 .

    1 - 它避免了你经常在这些建议中看到的很多东西

    2 - 它 does not 允许愚蠢的电子邮件,例如"x@x",它们在技术上是有效的,但是完全是愚蠢的 - 而且你的支持人员等,无论如何都会立即拒绝 . 如果您需要允许使用愚蠢电子邮件的解决方案,请使用其他解决方案 .

    3 - 非常 understandable

    4 - 这是KISS,可靠, tested to destruction on commercial apps with enormous numbers of users

    let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
    let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
    let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,8}"
    let __emailPredicate = NSPredicate(format: "SELF MATCHES %@", __emailRegex)
    
    extension String {
        func isEmail() -> Bool {
            return __emailPredicate.evaluate(with: self)
        }
    }
    
    extension UITextField {
        func isEmail() -> Bool {
            return self.text.isEmail()
        }
    }
    

    说明:

    在以下描述中,“OC”表示普通字符:因此,字母或数字 .

    __firstpart ...必须以OC开始和结束 . 对于中间的字符,你可以有一些不寻常的字符,如下划线,但开始和结束必须是OC . (只有一个OC就可以了,例如:j@blah.com)

    __serverpart ...你有像“等等”的部分 . 重复一遍 . (所以,mail.city.fcu.edu类型的东西 . )这些部分必须以OC开头和结尾,但在中间你也可以使用短划线“ - ” . (如果你想在其中允许其他不寻常的字符,请说明下划线,只需在短划线之前添加它 . )可以有一个只有一个OC的部分 . (如joe@w.campus.edu)你最多可以有五个部分;你必须有一个 . 最后,TLD(例如.com)的大小严格为2到8 .

    令人惊讶......

    Note that you simply keep the predicate as a global (trivial in Swift), no need to build it every time.

    最初级的专业iOS工程师会知道这一点 .

    令人惊讶的是,本页上没有一个答案提到这一点 .

    请注意,这是苹果公司在doco中提到的第一件事!

    任何不使用全局方法的解决方案都可以被描述为“非常差” .

  • 6

    这是Swift 2.0 - 2.2的更新版本

    var isEmail: Bool {
        do {
            let regex = try NSRegularExpression(pattern: "^[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])?)*$", options: .CaseInsensitive)
            return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
        } catch {
            return false
        }
    }
    
  • 14

    我建议使用它作为String的扩展:

    extension String {    
        public 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: length))
    
            return (firstMatch?.range.location != NSNotFound && firstMatch?.url?.scheme == "mailto")
        }
    
        public var length: Int {
            return self.characters.count
        }
    }
    

    并使用它:

    if "hodor@gameofthrones.com".isEmail { // true
        print("Hold the Door")
    }
    
  • 3

    这是一个基于 rangeOfString 的方法:

    class func isValidEmail(testStr:String) -> Bool {
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let range = testStr.rangeOfString(emailRegEx, options:.RegularExpressionSearch)
        let result = range != nil ? true : false
        return result
    }
    

    注意:更新的TLD长度 .

    以下是根据RFC 5322确定的电子邮件RegEx,请注意,最好不要使用它,因为它只检查电子邮件地址的基本语法,而不检查是否存在顶级域 .

    (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
      |  "(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
          |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
    @ (?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
      |  \[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
           (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:
              (?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
              |  \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)
         \])
    

    有关电子邮件RegEx的更多完整信息,请参阅Regular-Expressions.info .

    请注意,没有像Objective-C或Swift等语言所要求的转义 .

  • 0

    更新了答案@Arsonik回答Swift 2.2,使用比其他提供的解决方案更简洁的代码:

    extension String {
        func isValidEmail() -> Bool {
            let regex = try? NSRegularExpression(pattern: "^[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])?)*$", options: .CaseInsensitive)
            return regex?.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
        }
    }
    
  • 20

    这里有很多正确的答案,但许多“正则表达式”都是不完整的,可能会发生如下邮件:“name @ domain”会产生有效的电子邮件,但事实并非如此 . 完整的解决方案:

    extension String {
    
        var isEmailValid: Bool {
            do {
                let regex = try NSRegularExpression(pattern: "(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", options: .CaseInsensitive)
                return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
            } catch {
                return false
            }
        }
    }
    
  • 0

    我更喜欢使用扩展名 . 此外,这个url http://emailregex.com可以帮助你测试正则表达式是否正确 . 实际上,该站点为某些编程语言提供了不同的实现 . 我分享了 Swift 3 的实现 .

    extension String {
        func validateEmail() -> Bool {
            let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
            return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
        }
    }
    
  • 7

    对于swift 2.1:这适用于电子邮件foo @ bar

    extension String {
        func isValidEmail() -> Bool {
            do {
                let regex = try NSRegularExpression(pattern: "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}", options: .CaseInsensitive)
                return regex.firstMatchInString(self, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, self.characters.count)) != nil
            } catch {
                    return false
            }
        }
    }
    
  • 7

    创建简单扩展:

    extension NSRegularExpression {
    
        convenience init(pattern: String) {
            try! self.init(pattern: pattern, options: [])
        }
    }
    
    extension String {
    
        var isValidEmail: Bool {
            return isMatching(expression: NSRegularExpression(pattern: "^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$"))
        }
    
        //MARK: - Private
    
        private func isMatching(expression: NSRegularExpression) -> Bool {
            return expression.numberOfMatches(in: self, range: NSRange(location: 0, length: characters.count)) > 0
        }
    }
    

    例:

    "b@bb.pl".isValidEmail //true
    "b@bb".isValidEmail //false
    

    您可以将以下扩展名扩展为您需要的任何内容: isValidPhoneNumberisValidPassword 等...

  • 99

    使用Swift 4.2

    extension String {
        func isValidEmail() -> Bool {
            let regex = try? NSRegularExpression(pattern: "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$", options: .caseInsensitive)
            return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
        }
        func isValidName() -> Bool{
            let regex = try? NSRegularExpression(pattern: "^[\\p{L}\\.]{2,30}(?: [\\p{L}\\.]{2,30}){0,2}$", options: .caseInsensitive)
    
            return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.count)) != nil
        } }
    

    并使用

    if (textField.text?.isValidEmail())! 
        {
          // bla bla
        }
    else 
        {
    
        }
    
  • 0

    我创建了一个专为输入验证而设计的库,其中一个“模块”允许您轻松验证一堆内容......

    例如,验证电子邮件:

    let emailTrial = Trial.Email
    let trial = emailTrial.trial()
    
    if(trial(evidence: "test@test.com")) {
       //email is valid
    }
    

    SwiftCop是图书馆......希望它有所帮助!

  • 98

    这是@Fattie的 "THE REASONABLE SOLUTION" 的新版本,在一个名为 String+Email.swift 的新文件中测试了Swift 4.1:

    import Foundation
    
    extension String {
        private static let __firstpart = "[A-Z0-9a-z]([A-Z0-9a-z._%+-]{0,30}[A-Z0-9a-z])?"
        private static let __serverpart = "([A-Z0-9a-z]([A-Z0-9a-z-]{0,30}[A-Z0-9a-z])?\\.){1,5}"
        private static let __emailRegex = __firstpart + "@" + __serverpart + "[A-Za-z]{2,6}"
    
        public var isEmail: Bool {
            let predicate = NSPredicate(format: "SELF MATCHES %@", type(of:self).__emailRegex)
            return predicate.evaluate(with: self)
        }
    }
    

    所以它的用法很简单:

    let str = "mail@domain.com"
    if str.isEmail {
        print("\(str) is a valid e-mail address")
    } else {
        print("\(str) is not a valid e-mail address")
    }
    

    一世根本不喜欢将 func 添加到 String 对象,因为它们是(或不是)固有的电子邮件地址 . 因此,根据我的理解, Bool 属性比 func 更合适 .

  • 8

    Swift 4.2 和Xcode 10.1中

    //Email validation
    func isValidEmail(email: String) -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
        if valid {
            valid = !email.contains("Invalid email id")
        }
        return valid
    }
    
    //Use like this....
    let emailTrimmedString = emailTF.text?.trimmingCharacters(in: .whitespaces)
    if isValidEmail(email: emailTrimmedString!) == false {
       SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter valid email")
    }
    

    如果要使用SharedClass .

    //This is SharedClass
    import UIKit
    class SharedClass: NSObject {
    
    static let sharedInstance = SharedClass()
    
    //Email validation
    func isValidEmail(email: String) -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        var valid = NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: email)
        if valid {
            valid = !email.contains("Invalid email id")
        }
        return valid
    }
    
    private override init() {
    
    }
    }
    

    并调用这样的函数....

    if SharedClass.sharedInstance. isValidEmail(email: emailTrimmedString!) == false {
       SharedClass.sharedInstance.alert(view: self, title: "", message: "Please enter correct email")
       //Your code here
    } else {
       //Code here
    }
    
  • 0

    @ JeffersonBe的答案很接近,但如果字符串是"something containing someone@something.com a valid email"则返回 true ,这不是我们想要的 . 以下是String的扩展,运行良好(并允许测试有效的phoneNumber和其他数据检测器启动 .

    /// Helper for various data detector matches.
    /// Returns `true` iff the `String` matches the data detector type for the complete string.
    func matchesDataDetector(type: NSTextCheckingResult.CheckingType, scheme: String? = nil) -> Bool {
        let dataDetector = try? NSDataDetector(types: type.rawValue)
        guard let firstMatch = dataDetector?.firstMatch(in: self, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: length)) else {
            return false
        }
        return firstMatch.range.location != NSNotFound
            // make sure the entire string is an email, not just contains an email
            && firstMatch.range.location == 0
            && firstMatch.range.length == length
            // make sure the link type matches if link scheme
            && (type != .link || scheme == nil || firstMatch.url?.scheme == scheme)
    }
    /// `true` iff the `String` is an email address in the proper form.
    var isEmail: Bool {
        return matchesDataDetector(type: .link, scheme: "mailto")
    }
    /// `true` iff the `String` is a phone number in the proper form.
    var isPhoneNumber: Bool {
        return matchesDataDetector(type: .phoneNumber)
    }
    /// number of characters in the `String` (required for above).
    var length: Int {
        return self.characters.count
    }
    
  • 15

    并为 Swift 3

    extension String {
        func isValidEmail() -> Bool {
            let regex = try? NSRegularExpression(pattern: "^[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])?)*$", options: .caseInsensitive)
            return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
        }
    }
    
  • 0

    我对响应列表的唯一补充是,对于Linux, NSRegularExpression 不存在,它实际上是 RegularExpression

    func isEmail() -> Bool {
    
        let patternNormal = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"
    
        #if os(Linux)
            let regex = try? RegularExpression(pattern: patternNormal, options: .caseInsensitive)
        #else
            let regex = try? NSRegularExpression(pattern: patternNormal, options: .caseInsensitive)
        #endif
    
        return regex?.firstMatch(in: self, options: [], range: NSMakeRange(0, self.characters.count)) != nil
    

    这在macOS和Ubuntu上都能成功编译 .

  • 0

    这是Swift 3的扩展

    extension String {
        func isValidEmail() -> Bool {
            let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
            return NSPredicate(format: "SELF MATCHES %@", emailRegex).evaluate(with: self)
        }
    }
    

    只需像这样使用它:

    if yourEmailString.isValidEmail() {
        //code for valid email address
    } else {
        //code for not valid email address
    }
    
  • 1
    //Email validation
    func validateEmail(enterEmail:String) -> Bool{
        let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let emailPredicate = NSPredicate(format:"SELF MATCHES %@",emailFormat)
        return emailPredicate.evaluate(with:enterEmail)
    }
    

    100% working and tested

  • 651

    最好的解决方案,最好的结果

    Swift 4.x

    extension String {
    
            func validateAsEmail() -> Bool {
                let emailRegEx = "(?:[a-zA-Z0-9!#$%\\&‘*+/=?\\^_`{|}~-]+(?:\\.[a-zA-Z0-9!#$%\\&'*+/=?\\^_`{|}" +
                    "~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" +
                    "x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" +
                    "z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" +
                    "]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" +
                    "9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" +
                "-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"
    
                let emailTest = NSPredicate(format:"SELF MATCHES[c] %@", emailRegEx)
                return emailTest.evaluate(with: self)
            }
        }
    
  • 3

    我喜欢创建扩展

    extension String {
    
    func isValidateEmail() -> Bool {
        let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
        return emailPredicate.evaluate(with: self)
    }
    
    }
    

    用法:

    if emailid.text!.isValidateEmail() == false(){
     //do what ever you want if string is not matched.
    
    }
    
  • 0

    我改进了@Azik的答案 . 我允许指南允许的更多特殊字符,以及返回一些额外的边缘情况作为无效 .

    该小组认为,这里只允许 ._%+- 在本地部分根据指南不正确 . 请参阅@Anton Gogolev回答this问题或参见下文:

    电子邮件地址的本地部分可以使用以下任何ASCII字符:大写和小写拉丁字母A到Z和a到z;数字0到9;特殊字符!#$%&'* - / =?^ _`{|}〜;如果它不是引用的第一个或最后一个字符,并且除非引用它也不连续出现(例如,John..Doe @ example.com不允许,但是“John..Doe”@example . com是允许的);空格和“(),:; <> @ []字符允许有限制(它们只允许在带引号的字符串中,如下段所述,此外,必须在前面加上反斜杠或双引号反斜杠);允许在本地部分两端用括号注释;例如john.smith(comment)@ example.com和(comment)john.smith@example.com都等同于john.smith@example . COM;

    我使用的代码不允许限制不合适的特殊字符,但会允许比这里的大多数答案更多的选项 . 我希望在谨慎方面更轻松地验证错误 .

    if enteredText.contains("..") || enteredText.contains("@@") 
       || enteredText.hasPrefix(".") || enteredText.hasSuffix(".con"){
           return false
    }
    
    let emailFormat = "[A-Z0-9a-z.!#$%&'*+-/=?^_`{|}~]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)     
    return emailPredicate.evaluate(with: enteredText)
    
  • 24

    或者您可以为UITextField的可选文本添加扩展名:

    如何使用:

    if  emailTextField.text.isEmailValid() {
          print("email is valid")
    }else{
          print("wrong email address")
    }
    

    延期:

    extension Optional where Wrapped == String {
        func isEmailValid() -> Bool{
            guard let email = self else { return false }
            let emailPattern = "[A-Za-z-0-9.-_]+@[A-Za-z0-9]+\\.[A-Za-z]{2,3}"
            do{
                let regex = try NSRegularExpression(pattern: emailPattern, options: .caseInsensitive)
                let foundPatters = regex.numberOfMatches(in: email, options: .anchored, range: NSRange(location: 0, length: email.count))
                if foundPatters > 0 {
                    return true
                }
            }catch{
                //error
            }
            return false
        }
    }
    
  • 2

    这是当前Swiftmailer中一种非常简单的方法 . 大多数其他答案都很陈旧,重新发明轮子 .

    根据Swiftmailer文档:https://swiftmailer.symfony.com/docs/messages.html#quick-reference

    use Egulias\EmailValidator\EmailValidator;
    use Egulias\EmailValidator\Validation\RFCValidation;
    
    $validator = new EmailValidator();
    $validator->isValid("example@example.com", new RFCValidation()); //true
    

    这是迄今为止最简单,最强大的方法,即imo . 只需通过Composer安装Egulias \ EmailValidator库,该库本来应该作为SwiftMailer的依赖项引入 .

相关问题