在我的应用用户中可以输入他的电子邮件或电话号码。我需要验证它是电话号码还是电子邮件。如果输入电子邮件,则应进行验证 例如:如果用户仅输入" @ 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
}
此代码对我来说很好,但需要更好的解决方案。提前致谢
答案 0 :(得分:1)
为什么不简单地修改正则表达式?它已经检查@
字符之前是否有一个或多个字符。如果您要检查两个或更多,请使用{2,}
let emailFormat = "[A-Z0-9a-z._%+-]{2,}@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
除了电话验证,这是应用正则表达式的更快方式
模式是
[A-Z0-9a-z._%+-]
@
[A-Za-z0-9.-]
.
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