如何检查字符串是否只包含 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)
}

除了使用正则表达式,您还可以使用 CharacterSets 来检查某些字符是否存在(或不存在)。要检查字符串是否只有数字,您可以使用以下命令:

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,而且在我看来,它比使用正则表达式字符串更简洁。