检查字符串是否是Swift中的字母数字

ma1*_*w28 32 string alphanumeric swift

在Swift中,我如何检查a String是否是字母数字,即,它是否只包含一个或多个字母数字字符[a-zA-Z0-9],不包括带有变音符号的字母,例如é.

ma1*_*w28 56

extension String {
    var isAlphanumeric: Bool {
        return !isEmpty && range(of: "[^a-zA-Z0-9]", options: .regularExpression) == nil
    }
}

"".isAlphanumeric        // false
"abc".isAlphanumeric     // true
"123".isAlphanumeric     // true
"ABC123".isAlphanumeric  // true
"iOS 9".isAlphanumeric   // false
Run Code Online (Sandbox Code Playgroud)

  • 您可能要使用此正则表达式,它正用于此用途:`^ [:alnum:] + $` (2认同)

gav*_*non 23

现代Swift 3和4解决方案

extension String {

    func isAlphanumeric() -> Bool {
        return self.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) == nil && self != ""
    }

    func isAlphanumeric(ignoreDiacritics: Bool = false) -> Bool {
        if ignoreDiacritics {
            return self.range(of: "[^a-zA-Z0-9]", options: .regularExpression) == nil && self != ""
        }
        else {
            return self.isAlphanumeric()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

"".isAlphanumeric()         == false
"Hello".isAlphanumeric()    == true
"Hello 2".isAlphanumeric()  == false
"Hello3".isAlphanumeric()   == true

"Français".isAlphanumeric() == true
"Français".isAlphanumeric(ignoreDiacritics: true) == false
Run Code Online (Sandbox Code Playgroud)

这适用于英语以外的语言,允许使用è和á等变音字符.如果您想忽略这些,请使用标记" ignoreDiacritics: true".


car*_*onr 14

我觉得使用正则表达式接受的答案是具体的,但却是一个相当重的解决方案.您也可以在Swift 3.0中以这种方式检查它:

if yourString.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
    return "Username can only contain numbers or digits"
}
Run Code Online (Sandbox Code Playgroud)

  • 这感觉像是一个更理智的解决方案。 (2认同)
  • 谢谢,但是这个解决方案允许带有变音符号的字母,例如é,这不是我想要的. (2认同)

neo*_*eye 5

extension String {
    /// Allows only `a-zA-Z0-9`
    public var isAlphanumeric: Bool {
        guard !isEmpty else {
            return false
        }
        let allowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
        let characterSet = CharacterSet(charactersIn: allowed)
        guard rangeOfCharacter(from: characterSet.inverted) == nil else {
            return false
        }
        return true
    }
}

XCTAssertFalse("".isAlphanumeric)
XCTAssertFalse("climate change".isAlphanumeric)
XCTAssertFalse("Poüet".isAlphanumeric)
XCTAssertTrue("Hawking2018".isAlphanumeric)
Run Code Online (Sandbox Code Playgroud)