ios - 根据正则表达式,电子邮件验证是错误的

标签 ios regex swift email-validation

我在我的项目中使用电子邮件验证,方法如下

//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”,而不是多个域或子域。

我也尝试了来自谷歌的不同正则表达式并将其实现到项目中但同样的问题发生了。
请帮助我。
谢谢

最佳答案

不要重新发明轮子:

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

这将确保整个文本是一个单一、有效的电子邮件地址,没有任何多余的字符。

关于ios - 根据正则表达式,电子邮件验证是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41887760/

相关文章:

Java 在忽略括号之间的任何定界符的同时拆分字符串

regex - 如何在sh中使用 '-prune'的 'find'选项?

swift - 从 JSONDecoder.decode() 的字符串中动态获取类类型

swift - 如何从 NSDate(timeIntervalSince1970) 转换为 NSDate()?

python - 使用starflut在flutter中导入python模块

ios - UICollectionview 用户交互禁用第一个单元格,也禁用滚动上的其他几个单元格

ios - 将 DatePicker 日期转换为 UTC 格式返回 NULL

ios - Core Data 并发队列风格 MOC getters 线程安全

javascript - 在 JavaScript 中通过正则表达式拆分字符串

ios - 在 Firebase 中再次登录后删除子根节点? - swift