【发布时间】:2011-11-04 15:54:59
【问题描述】:
我正在开发一个自定义 NSFormatter。
我需要逐步验证用户输入...我想通过isPartialStringValid: 检查字符串是否仅包含允许的字符“0123456789ABCDEF”。
我怎样才能验证这个条件?有没有办法用 NSString 函数来检查一个字符串是否只包含一些字符?
【问题讨论】:
我正在开发一个自定义 NSFormatter。
我需要逐步验证用户输入...我想通过isPartialStringValid: 检查字符串是否仅包含允许的字符“0123456789ABCDEF”。
我怎样才能验证这个条件?有没有办法用 NSString 函数来检查一个字符串是否只包含一些字符?
【问题讨论】:
这个方法对你有用吗?
NSString *string = @"FF";
NSCharacterSet *chars = [[NSCharacterSet
characterSetWithCharactersInString:@"0123456789ABCDEF"] invertedSet];
BOOL isValid = (NSNotFound == [string rangeOfCharacterFromSet:chars].location);
【讨论】:
extension String {
var isHexNumber: Bool {
filter(\.isHexDigit).count == count
}
}
print("text1".isHexNumber) // false
print("aa32".isHexNumber) // true
print("AD1".isHexNumber) // true
【讨论】:
您可以创建包含允许字符 (+ characterSetWithCharactersInString:) 的自定义 NSCharacterSet,然后使用 rangeOfCharacterFromSet: 测试字符串。如果返回的范围等于字符串的整个范围,则您有一个匹配项。
另一个选项是匹配NSRegularExpression。
Swift 示例代码:
func isValidHexNumber() -> Bool {
guard isEmpty == false else { return false }
let chars = CharacterSet(charactersIn: "0123456789ABCDEF").inverted
return uppercased().rangeOfCharacter(from: chars) == nil
}
【讨论】:
在 swift 2.1 中,您可以通过这种方式扩展 String:
extension String {
func isValidHexNumber() -> Bool {
let chars = NSCharacterSet(charactersInString: "0123456789ABCDEF").invertedSet
guard self.uppercaseString.rangeOfCharacterFromSet(chars) != nil else {
return false
}
return true
}
}
【讨论】:
Swift 单行,不添加任何扩展:
myString.allSatisfy(\.isHexDigit)
在 Swift 5.2 中引入了 keypath 谓词,在此之前您可以使用:
myString.allSatisfy({ $0.isHexDigit })
【讨论】: