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

问题描述 投票:0回答:9

在 Swift 中,如何检查

String
是否为字母数字,即它是否仅包含一个或多个字母数字字符
[a-zA-Z0-9]
,不包括带变音符号的字母,例如 é。

string swift alphanumeric
9个回答
82
投票
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

30
投票

现代 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()
        }
    }

}

用途:

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

"Français".isAlphanumeric() == true
"Français".isAlphanumeric(ignoreDiacritics: true) == false

这适用于英语以外的语言,允许使用变音符号,如 è 和 á 等。如果您想忽略这些字符,请使用标志“

ignoreDiacritics: true
”。


20
投票

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

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

7
投票
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)

4
投票

这是一个简洁的方法:

extension String {
    var isAlphanumeric: Bool {
       allSatisfy { $0.isLetter || $0.isNumber }
    }
}

3
投票

CharacterSet.alphanumerics
字符集的问题在于它比
[a-zA-Z0-9]
更宽松。它包含带变音符号的字母、东方阿拉伯数字等。

assert(["e", "E", "3"].allSatisfy({ CharacterSet.alphanumerics.contains($0) }))
assert(["ê", "É", "٣"].allSatisfy({ CharacterSet.alphanumerics.contains($0) }))

您可以仅使用特定的 62 个“字母数字”字符来构建您自己的

CharacterSet

extension CharacterSet {
    
    static var alphanumeric62: CharacterSet {
        return lowercase26.union(uppercase26).union(digits10)
    }
    
    static var lowercase26: CharacterSet { CharacterSet(charactersIn: "a"..."z") }
    static var uppercase26: CharacterSet { CharacterSet(charactersIn: "A"..."Z") }
    static var digits10:    CharacterSet { CharacterSet(charactersIn: "0"..."9") }
    
}

assert(["e", "E", "3"].allSatisfy({ CharacterSet.alphanumeric62.contains($0) }))
assert(["ê", "É", "٣"].allSatisfy({ CharacterSet.alphanumeric62.contains($0) == false }))

然后根据该字符集的inverse测试你的字符串:

guard "string".rangeOfCharacter(from: CharacterSet.alphanumeric62.inverted) == nil else {
    fatalError()
}

1
投票

此正则表达式用于检查字符串是否包含至少 1 个字母 + 至少 1 个数字以及 8 个字符。

"^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$"

1
投票
extension String {  
   var isAlphaNumeric: Bool {
        let hasLetters = rangeOfCharacter(from: .letters, options: .numeric, range: nil) != nil
        let hasNumbers = rangeOfCharacter(from: .decimalDigits, options: .literal, range: nil) != nil
        let comps = components(separatedBy: .alphanumerics)
        return comps.joined(separator: "").count == 0 && hasLetters && hasNumbers  
   } 
}

0
投票

使用 rmp251 的简洁方法,但采用 Ranoiaetep 建议的附加检查。用于验证不允许使用变音符号的输入代码。

extension String {
    var isAlphanumeric: Bool {
        allSatisfy { ($0.isLetter && $0.isASCII) || $0.isNumber }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.