在Swift 2之前我使用此扩展来检查字符串是否仅由数字组成:
func isNumbersOnly() -> Bool {
let regexNumbersOnly = NSRegularExpression(pattern: ".*[^0-9].*", options: nil, error: nil)!
return regexNumbersOnly.firstMatchInString(self, options: nil, range: NSMakeRange(0, self.length())) != nil
}
但现在使用Swift 2我收到了错误
无法为类型' NSRegularExpression'调用初始化程序。与 类型'的参数列表(模式:字符串,选项: NilLiteralConvertible,错误:NilLiteralConvertible)'
现在有更好的方法吗?日Thnx!
答案 0 :(得分:2)
在Swift 2 NSRegularExpression" throws"因此您必须将其与try
一起使用。
此外,您无法再通过nil
选项:如果您不想指定选项,请传递一个空数组(firstMatchInString
也相同)。
self.length()
应该成为self.characters.count
。
最后注意:如果目标是确定一个字符串是否仅包含数字,并且由于您将其命名为#nn; isNumbersOnly",如果只有#s;那么结果布尔值应该为真数字:它目前是反向的。我已经在我的例子中解决了这个问题。
忽略错误:
let regexNumbersOnly = try! NSRegularExpression(pattern: ".*[^0-9].*", options: [])
return regexNumbersOnly.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == nil
正确处理错误:
do {
let regexNumbersOnly = try NSRegularExpression(pattern: ".*[^0-9].*", options: [])
return regexNumbersOnly.firstMatchInString(self, options: [], range: NSMakeRange(0, self.characters.count)) == nil
} catch let error as NSError {
print(error.description)
}
答案 1 :(得分:1)
Swift 2调整了错误处理过程;您现在应该try
来电,而不是指定error
并准备好捕捉异常。
E.g。
do {
let regexNumbersOnly = try NSRegularExpression(pattern: ..., options: nil)
... etc ...
} catch _ {}
...鉴于您选择不处理错误状态。
答案 2 :(得分:1)
您可以使用CharacterSet
来检查某些字符的存在(或不存在),而不是使用正则表达式。要检查字符串是否只是数字,您可以使用以下内容:
extension String {
var isDigits: Bool {
if isEmpty { return false }
// The inverted set of .decimalDigits is every character minus digits
let nonDigits = CharacterSet.decimalDigits.inverted
return rangeOfCharacter(from: nonDigits) == nil
}
}
此方法可以应用于任何类型的CharacterSet
,在我看来,比使用正则表达式字符串更清晰。