根据Regex,电子邮件验证错误

Jit*_*odi 2 regex email-validation ios swift

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

//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
    }
Run Code Online (Sandbox Code Playgroud)

要么

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
    }
Run Code Online (Sandbox Code Playgroud)

当我输入"modijecky@gmail.com"或任何其他错误输入时,这两个正则表达式都正常工作,但当我输入"modijecky@gmail.com.com"时它将无效.

所以,我发现"name @ .com.com"是一个有效的电子邮件地址,还有更多像这样的子域名.所以现在我希望用户不要进入子域.是否有任何REGEX可以在一个域内验证电子邮件地址,例如"name@gmail.com",而不是多个域或子域.

我也从谷歌尝试不同的正则表达并将其实施到项目中,但同样的问题发生.
请帮帮我.
谢谢

Col*_*aff 6

不要重新发明轮子:

不重塑轮子: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
Run Code Online (Sandbox Code Playgroud)

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

  • 我也会使用它代替正则表达式似乎不太容易出错和干净谢谢分享.:) (2认同)