如何在" @"之前验证一封至少应包含一些字符的电子邮件。

时间:2018-02-21 11:38:41

标签: ios validation swift4

在我的应用用户中可以输入他的电子邮件或电话号码。我需要验证它是电话号码还是电子邮件。如果输入电子邮件,则应进行验证 例如:如果用户仅输入" @ mail.com"需要向用户显示无效的邮件。在#34; @"前面至少应该有2或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)
    let email = emailPredicate.evaluate(with: enteredEmail)

    if enteredEmail.contains("@") {
        let characters = enteredEmail.components(separatedBy: "@")
        if characters.count > 0 {
            if characters[0].isEmpty {
                return false
            } else {
                return true
            }
        }
    }
    return email ? email : enteredEmail.count == 10 //if email evaluation is false check for phone number count 
}

此代码对我来说很好,但需要更好的解决方案。提前致谢

5 个答案:

答案 0 :(得分:1)

为什么不简单地修改正则表达式?它已经检查@字符之前是否有一个或多个字符。如果您要检查两个或更多,请使用{2,}

let emailFormat = "[A-Z0-9a-z._%+-]{2,}@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

除了电话验证,这是应用正则表达式的更快方式

模式是

  • 字符集[A-Z0-9a-z._%+-]
  • 中的2个或多个字符
  • 一个@
  • 字符集[A-Za-z0-9.-]
  • 中的一个或多个字符
  • 一个.
  • 2-64大写或小写alpha字母
func validateEmail(enteredEmail:String) -> Bool {
    let emailFormat = "[A-Z0-9a-z._%+-]{2,}@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
    return enteredEmail.range(of: emailFormat, options: .regularExpression) != nil
}

如果输入的字符串必须完全匹配模式,请使用

let emailFormat = "^[A-Z0-9a-z._%+-]{2,}@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}$"

修改

要包括电话验证(仅10位数),请使用

func validateEmail(enteredEmail:String) -> Bool {
    let emailFormat = "^[A-Z0-9a-z._%+-]{2,}@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}$"
    guard enteredEmail.range(of: emailFormat, options: .regularExpression) == nil else { return true }
    return enteredEmail.range(of: "^\\d{10}$", options: .regularExpression) != nil
}

答案 1 :(得分:0)

use hasPrefix:

Example:

"hello dolly".hasPrefix("hello")  // This will return true
"hello dolly".hasPrefix("abc")    // This will return false

That way you can check if the first character is '@' or not and go on from there with an if-else statement.

答案 2 :(得分:0)

正确定义了该功能所面临的问题是当用户输入类似“@ mail.com”的电子邮件时,因为您在验证前没有修剪字符。

您的代码应如下所示:

if enteredEmail.contains("@")
{

    let characters = enteredEmail.trimmingCharacters(in: CharacterSet.whitespaces).components(separatedBy: "@")
    if characters.count > 0 {
        if characters[0] > 2 {
            return true
        }else {
            return false
        }
    }
}

答案 3 :(得分:0)

正则表达式很好:错误在return语句中 - 我实际上不喜欢方法中间的代码。您应该使用另一个正则表达式验证电话号码,而不仅仅是字符串长度,然后删除它。

这里有一个更清洁的例子。您应该更改电话号码正则表达式:它是西班牙语电话号码。

import Foundation

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)
    let email = emailPredicate.evaluate(with: enteredEmail)

    return email
}

func validatePhoneNumber(enteredPhoneNumber:String) -> Bool {
    let phoneFormat = "\\A[0-9]{9}\\z"
    let phonePredicate = NSPredicate(format:"SELF MATCHES %@", phoneFormat)
    let phone = phonePredicate.evaluate(with: enteredPhoneNumber)

    return phone
}

func validate(enteredString: String) -> Bool {
    if validateEmail(enteredEmail: enteredString) == true {
        return true
    }
    else {
        return validatePhoneNumber(enteredPhoneNumber: enteredString)
    }
}

validate(enteredString: "@email.com") // false
validate(enteredString: "some@email.com") // true: first regex
validate(enteredString: "666666666") // true: second regex
validate(enteredString: "some rubbish") // false

答案 4 :(得分:0)

试试这个:

title