检查 Swift 中的字符串是否为字母数字
Check if a String is alphanumeric in Swift
在 Swift 中,如何检查 String
是否为字母数字,即它是否仅包含一个或多个字母数字字符 [a-zA-Z0-9]
,不包括带变音符号的字母,例如, é.
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
此正则表达式用于检查字符串是否包含至少 1 个字母 + 至少 1 个数字和 8 个字符。
"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$"
我觉得使用正则表达式的公认答案是具体但相当繁重的解决方案。您也可以在 Swift 3.0:
中以这种方式检查它
if yourString.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
return "Username can only contain numbers or digits"
}
现代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
”。
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)
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
}
}
CharacterSet.alphanumerics
字符集的问题在于它比 [a-zA-Z0-9]
更宽松。它包含带变音符号的字母、东方阿拉伯数字等
assert(["e", "E", "3"].allSatisfy({ CharacterSet.alphanumerics.contains([=10=]) }))
assert(["ê", "É", "٣"].allSatisfy({ CharacterSet.alphanumerics.contains([=10=]) }))
您可以仅使用特定的 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([=11=]) }))
assert(["ê", "É", "٣"].allSatisfy({ CharacterSet.alphanumeric62.contains([=11=]) == false }))
然后根据该 CharacterSet 的 inverse 测试您的字符串:
guard "string".rangeOfCharacter(from: CharacterSet.alphanumeric62.inverted) == nil else {
fatalError()
}
这是一个简洁的方法:
extension String {
var isAlphanumeric: Bool {
allSatisfy { [=10=].isLetter || [=10=].isNumber }
}
}
在 Swift 中,如何检查 String
是否为字母数字,即它是否仅包含一个或多个字母数字字符 [a-zA-Z0-9]
,不包括带变音符号的字母,例如, é.
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
此正则表达式用于检查字符串是否包含至少 1 个字母 + 至少 1 个数字和 8 个字符。
"^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$"
我觉得使用正则表达式的公认答案是具体但相当繁重的解决方案。您也可以在 Swift 3.0:
中以这种方式检查它if yourString.rangeOfCharacter(from: CharacterSet.alphanumerics.inverted) != nil {
return "Username can only contain numbers or digits"
}
现代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
”。
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)
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
}
}
CharacterSet.alphanumerics
字符集的问题在于它比 [a-zA-Z0-9]
更宽松。它包含带变音符号的字母、东方阿拉伯数字等
assert(["e", "E", "3"].allSatisfy({ CharacterSet.alphanumerics.contains([=10=]) }))
assert(["ê", "É", "٣"].allSatisfy({ CharacterSet.alphanumerics.contains([=10=]) }))
您可以仅使用特定的 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([=11=]) }))
assert(["ê", "É", "٣"].allSatisfy({ CharacterSet.alphanumeric62.contains([=11=]) == false }))
然后根据该 CharacterSet 的 inverse 测试您的字符串:
guard "string".rangeOfCharacter(from: CharacterSet.alphanumeric62.inverted) == nil else {
fatalError()
}
这是一个简洁的方法:
extension String {
var isAlphanumeric: Bool {
allSatisfy { [=10=].isLetter || [=10=].isNumber }
}
}