如何检查字符串是否只包含 Swift 2 中的数字?
How to check if a string only contains numbers in Swift 2?
在 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 我得到了错误
Cannot invoke initializer for type 'NSRegularExpression' with an
argument list of type '(pattern: String, options:
NilLiteralConvertible, error: NilLiteralConvertible)'
现在有更好的方法吗?谢谢!
Swift 2调整了错误处理流程;您现在应该 try
调用,而不是指定 error
并准备好捕获异常。
例如
do {
let regexNumbersOnly = try NSRegularExpression(pattern: ..., options: nil)
... etc ...
} catch _ {}
...假定您选择不处理错误状态。
In Swift 2 NSRegularExpression "throws" 所以你必须将它与 try
.
一起使用
此外,您不能再为选项传递 nil
:如果您不想指定选项,传递一个空数组(与 firstMatchInString
相同)。
而self.length()
应该变成self.characters.count
。
最后说明:如果目标是确定一个字符串是否仅包含数字,并且由于您将其命名为 "isNumbersOnly",如果只有数字,则生成的布尔值应该为真:目前是相反的。我已经在我的示例中解决了这个问题。
忽略错误:
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)
}
除了使用正则表达式,您还可以使用 CharacterSet
s 来检查某些字符是否存在(或不存在)。要检查字符串是否只有数字,您可以使用以下命令:
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
,而且在我看来,它比使用正则表达式字符串更简洁。
在 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 我得到了错误
Cannot invoke initializer for type 'NSRegularExpression' with an argument list of type '(pattern: String, options: NilLiteralConvertible, error: NilLiteralConvertible)'
现在有更好的方法吗?谢谢!
Swift 2调整了错误处理流程;您现在应该 try
调用,而不是指定 error
并准备好捕获异常。
例如
do {
let regexNumbersOnly = try NSRegularExpression(pattern: ..., options: nil)
... etc ...
} catch _ {}
...假定您选择不处理错误状态。
In Swift 2 NSRegularExpression "throws" 所以你必须将它与 try
.
此外,您不能再为选项传递 nil
:如果您不想指定选项,传递一个空数组(与 firstMatchInString
相同)。
而self.length()
应该变成self.characters.count
。
最后说明:如果目标是确定一个字符串是否仅包含数字,并且由于您将其命名为 "isNumbersOnly",如果只有数字,则生成的布尔值应该为真:目前是相反的。我已经在我的示例中解决了这个问题。
忽略错误:
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)
}
除了使用正则表达式,您还可以使用 CharacterSet
s 来检查某些字符是否存在(或不存在)。要检查字符串是否只有数字,您可以使用以下命令:
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
,而且在我看来,它比使用正则表达式字符串更简洁。