如何在 iOS swift 4 中进行名字验证?
How to have a firstname validation in iOS swift4?
我要在 UITextField
中的 swift4 中完成名字验证。问题是:
- 名字应以字母开头并以字母结尾,
- 没有尾随和前导白色space。
- 它们之间可以有spaces,可以包含点。
- 应介于 7 到 18 个字符之间。
目前我在 UITextField 中进行以下验证
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
switch textField {
case firstName:
print("firstname")
if string == " " {
return false
} else {
let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
let filtered = string.components(separatedBy: cs).joined(separator: "")
return (string == filtered)
}
}
return true
}
知道如何实现以下条件。现在我正在禁用 space 并且只接受字母表。
非常感谢任何帮助
您可以使用正则表达式根据您的条件验证名字。
我不是正则表达式专家,但是here you can see an example
^[a-zA-Z](?:[a-zA-Z\.\s][^\n]*)[a-zA-Z]$
此正则表达式将 return 您完全匹配。您可以检查 returned 字符串是否有效。
以及 Swift.
中使用正则表达式的示例
您可以使用 Swift 检查的字符串字符数,例如:
if string.count > 7 && string.count < 18 {
//String valid
}
从 UITextField
中取值时可以检查两个条件,它们是:
- 名字应该以字母开头和结尾
- 修剪末尾的空格。
其余条件可以在 shouldChangeCharactersInRange
内完成,如下所示:
let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. "
switch textField {
case firstName:
print("firstname")
//Condition for always accepting backcspaces
if string == "" {
return true
}
//Condition for restricting space at the begining
else if textField.text?.count == 0 && string == " " {
return false
}
//Condition for restricing user from entering more than 18 letters
else if (textField.text?.count)! > 17 {
return false
}
//Condition for only accepting the alphabets.
else {
let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
let filtered = string.components(separatedBy: cs).joined(separator: "")
return (string == filtered)
}
用于检查字母的最小数量,修剪末尾的空格,并在 按钮的点击 或类似的东西中以具有以下条件的字母开始和结束:
//Trimming whitespaces at the end
let firstname = firstName.text?.trimmingCharacters(in: .whitespaces)
let letters = NSCharacterSet.letters
let prefix = String((firstname?.first)!)
let suffix = String((firstname?.last)!)
//Checking if First Character is letter
if let _ = prefix.rangeOfCharacter(from: letters) {
print("letters found")
} else {
print("letters not found")
}
//Checking if Last Character is letter
if let _ = suffix.rangeOfCharacter(from: letters) {
print("letters found")
} else {
print("letters not found")
}
希望对您有所帮助。
您可以使用这个函数来获得简洁明了的方法
func isValid(testStr:String) -> Bool {
guard testStr.count > 7, testStr.count < 18 else { return false }
let predicateTest = NSPredicate(format: "SELF MATCHES %@", "^(([^ ]?)(^[a-zA-Z].*[a-zA-Z]$)([^ ]?))$")
return predicateTest.evaluate(with: testStr)
}
测试用例
isValid(testStr: " MyNameIsDahiya") // Invalid, leading space
isValid(testStr: "MyNameIsDahiya ") // Invalid, trailing space
isValid(testStr: " MyNameIsDahiya ") // Invalid, leading & trailing space
isValid(testStr: "1MyNameIsDahiya") // Invalid, Leading num
isValid(testStr: "MyNameIsDahiya1") // Invalid, trailing num
isValid(testStr: "1MyNameIsDahiya1") // Invalid, leading & trailing num
isValid(testStr: "MyName") // Invalid, length below 7
isValid(testStr: "MyNameIsDahiyaBlahhblahh") // Invalid, length above 18
isValid(testStr: "MyNameIsDahiya") // Valid,
isValid(testStr: "Mr. Dahiya") // Valid,
操场测试
Edit
试试下面的正则表达式:
(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{5,16}[a-z]$
它也会验证所有条件和长度。
我要在 UITextField
中的 swift4 中完成名字验证。问题是:
- 名字应以字母开头并以字母结尾,
- 没有尾随和前导白色space。
- 它们之间可以有spaces,可以包含点。
- 应介于 7 到 18 个字符之间。
目前我在 UITextField 中进行以下验证
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
switch textField {
case firstName:
print("firstname")
if string == " " {
return false
} else {
let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
let filtered = string.components(separatedBy: cs).joined(separator: "")
return (string == filtered)
}
}
return true
}
知道如何实现以下条件。现在我正在禁用 space 并且只接受字母表。
非常感谢任何帮助
您可以使用正则表达式根据您的条件验证名字。
我不是正则表达式专家,但是here you can see an example
^[a-zA-Z](?:[a-zA-Z\.\s][^\n]*)[a-zA-Z]$
此正则表达式将 return 您完全匹配。您可以检查 returned 字符串是否有效。
您可以使用 Swift 检查的字符串字符数,例如:
if string.count > 7 && string.count < 18 {
//String valid
}
从 UITextField
中取值时可以检查两个条件,它们是:
- 名字应该以字母开头和结尾
- 修剪末尾的空格。
其余条件可以在 shouldChangeCharactersInRange
内完成,如下所示:
let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. "
switch textField {
case firstName:
print("firstname")
//Condition for always accepting backcspaces
if string == "" {
return true
}
//Condition for restricting space at the begining
else if textField.text?.count == 0 && string == " " {
return false
}
//Condition for restricing user from entering more than 18 letters
else if (textField.text?.count)! > 17 {
return false
}
//Condition for only accepting the alphabets.
else {
let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
let filtered = string.components(separatedBy: cs).joined(separator: "")
return (string == filtered)
}
用于检查字母的最小数量,修剪末尾的空格,并在 按钮的点击 或类似的东西中以具有以下条件的字母开始和结束:
//Trimming whitespaces at the end
let firstname = firstName.text?.trimmingCharacters(in: .whitespaces)
let letters = NSCharacterSet.letters
let prefix = String((firstname?.first)!)
let suffix = String((firstname?.last)!)
//Checking if First Character is letter
if let _ = prefix.rangeOfCharacter(from: letters) {
print("letters found")
} else {
print("letters not found")
}
//Checking if Last Character is letter
if let _ = suffix.rangeOfCharacter(from: letters) {
print("letters found")
} else {
print("letters not found")
}
希望对您有所帮助。
您可以使用这个函数来获得简洁明了的方法
func isValid(testStr:String) -> Bool {
guard testStr.count > 7, testStr.count < 18 else { return false }
let predicateTest = NSPredicate(format: "SELF MATCHES %@", "^(([^ ]?)(^[a-zA-Z].*[a-zA-Z]$)([^ ]?))$")
return predicateTest.evaluate(with: testStr)
}
测试用例
isValid(testStr: " MyNameIsDahiya") // Invalid, leading space
isValid(testStr: "MyNameIsDahiya ") // Invalid, trailing space
isValid(testStr: " MyNameIsDahiya ") // Invalid, leading & trailing space
isValid(testStr: "1MyNameIsDahiya") // Invalid, Leading num
isValid(testStr: "MyNameIsDahiya1") // Invalid, trailing num
isValid(testStr: "1MyNameIsDahiya1") // Invalid, leading & trailing num
isValid(testStr: "MyName") // Invalid, length below 7
isValid(testStr: "MyNameIsDahiyaBlahhblahh") // Invalid, length above 18
isValid(testStr: "MyNameIsDahiya") // Valid,
isValid(testStr: "Mr. Dahiya") // Valid,
操场测试
Edit
试试下面的正则表达式:
(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{5,16}[a-z]$
它也会验证所有条件和长度。