我想验证我的textField只检查Alphabet&允许的空格,如果给出了数字,那么它将返回警告错误。
//First I declare my value to variable
var nameValue: String = mainView.nameTextField.text!
//Then I declare this
let set = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ")
//And this is the validation
if(nameValue.rangeOfCharacter(from: set.inverted) != nil ){
self.showAlert(message: "Must not contain Number in Name")
} else {
//other code
}
ex: nameValue : "abcd" it works, but
if nameValue : "ab cd" whitespace included, it returns the showAlert message.
此代码有效但仅适用于字母表,我现在需要的是字母和空格。而且我猜的是硬编码。也许你们这个案例有更好的代码和选项。
谢谢。
答案 0 :(得分:7)
最简单的方法是在字符集中添加新行,如
function splitOnWhitespaceOutsideBalancedParens() {
var item = '', result = [], stack = 0, whitespace = /\s/;
for (var i=0; i < text.length; i++) {
if ( text[i].match(whitespace) && stack == 0 ) {
result.push(item);
item = '';
continue;
} else if ( text[i] == '(' ) {
stack++;
} else if ( text[i] == ')' ) {
stack--;
}
item += text[i];
}
result.push(item);
return result;
}
var text = "contrast(200%) drop-shadow(rgba(0, 0, 0, 0.5) 0px 0px 10px)";
console.log(splitOnWhitespaceOutsideBalancedParens(text));
即,在包含的字符集的末尾添加空格字符&#34; &#34;
您可以使用像
这样的正则表达式,而不是硬编码let set = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ ")
答案 1 :(得分:3)
使用正则表达式:
let regex = try! NSRegularExpression(pattern: "[a-zA-Z\\s]+", options: [])
你可以这样匹配:
let range = regex.rangeOfFirstMatch(in: string, options: [], range: NSRange(location: 0, length: string.characters.count))
return range.length == string.characters.count
答案 2 :(得分:1)
首先,您必须自己继承UITextFieldDelegate类 课
class ViewController: UIViewController, UITextFieldDelegate {
第二次添加IBOutlet
@IBOutlet weak var firstName: UITextField!
第三个必须确保该对象正在使用
override func viewDidLoad() {
super.viewDidLoad()
firstName.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == firstName {
let allowedCharacters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
let allowedCharacterSet = CharacterSet(charactersIn: allowedCharacters)
let typedCharacterSet = CharacterSet(charactersIn: string)
let alphabet = allowedCharacterSet.isSuperset(of: typedCharacterSet)
return alphabet
}
}
答案 3 :(得分:1)
pattern: ".*[^A-Za-z0-9 ].*"
允许输入字符,数字, 或space(“”)
pattern: ".*[^A-Za-z ].*"
允许输入字符或空格(“ “)
pattern: ".*[^A-Za-z].*"
仅允许输入字符
下面的示例
extension [YourViewController]: UITextFieldDelegate
{
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
do {
let regex = try NSRegularExpression(pattern: ".*[^A-Za-z0-9 ].*", options: [])
if regex.firstMatch(in: string, options: [], range: NSMakeRange(0, string.count)) != nil {
return false
}
}
catch {
print("ERROR")
}
return true
}
}
答案 4 :(得分:0)
以上所有解决方案都不错,但仅适用于英语字母([^ A-Za-z])。因此,此解决方案不适用于我,因为我的应用程序是为多语言支持而开发的。为此,我编写了一个解决方案,并且适用于所有语言。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let allowedCharacter = CharacterSet.letters
let allowedCharacter1 = CharacterSet.whitespaces
let characterSet = CharacterSet(charactersIn: string)
return allowedCharacter.isSuperset(of: characterSet) || allowedCharacter1.isSuperset(of: characterSet)
}
答案 5 :(得分:0)
extension String {
var lettersAndSpaces: String {
return components(separatedBy: CharacterSet.letters.union(.whitespaces).inverted).joined()
}
var isEmptyOrWhitespace: Bool {
let whitespace = CharacterSet.whitespacesAndNewlines
return self.trimmingCharacters(in: whitespace).isEmpty
}
}
然后您可以使用它:
if newValue.lettersAndSpaces.isEmptyOrWhitespace {
showError()
}
顺便说一句。这也会在多个
答案 6 :(得分:0)
只是一个补充;使用这样的正则表达式:[a-zA-Z\s]+
仅适用于ASCII字母,不适用于unicode字符。
例如:
some string -> Matches
some other string -> Matches
sömé øthër strīng -> NoMatches
test 漢字 -> NoMatches
如果还要匹配非ASCII字母,则可能要使用:[\p{L}\s]+
。 \p(L)
匹配来自任何语言的任何字母。