这是我目前所做的(用于测试目的):
let string = "The quick BroWn fOX jumpS Over tHe lazY DOg"
for chr in string {
if isupper(String(chr)) {
print(String(chr).lowercaseString)
continue
}
print(chr)
}
如何测试大写和小写字符?
我知道我可以从swift调用C函数,但这似乎不适合我。我怎么能做到这一点与swift只?
我不确定你试图避免使用C函数是什么意思。我希望这不会包括在开发应用程序时避开OS X和iOS提供的框架和基础库,例如,ncharacter set类,它提供了你在Unicode兼容实现中所需要的东西。
扩展Matt的回答,让它更接近你问题的要求:
import UIKit
let testString = "Åke röstet un café in Владивосток!"
let lowerCase = NSCharacterSet.lowercaseLetterCharacterSet()
let upperCase = NSCharacterSet.uppercaseLetterCharacterSet()
for currentCharacter in testString.utf16 {
if lowerCase.characterIsMember(currentCharacter) {
println("Character code (currentCharacter) is lowercase.")
} else if upperCase.characterIsMember(currentCharacter) {
println("Character code (currentCharacter) is UPPERCASE.")
} else {
println("Character code (currentCharacter) is neither upper- nor lowercase.")
}
}
迅速3
let testString = "Åke röstet un café in Владивосток!"
let lowerCase = CharacterSet.lowercaseLetters
let upperCase = CharacterSet.uppercaseLetters
for currentCharacter in testString.unicodeScalars {
if lowerCase.contains(currentCharacter) {
print("Character code (currentCharacter) is lowercase.")
} else if upperCase.contains(currentCharacter) {
print("Character code (currentCharacter) is UPPERCASE.")
} else {
print("Character code (currentCharacter) is neither upper- nor lowercase.")
}
}
在Swift 5中,我们现在可以根据Unicode标准检查字符属性。
对于你的问题,chr.isUppercase
和chr.isLowercase
是答案。
您总是可以看到小写表示是否与当前值不同;
let string = "The quick BroWn fOX jumpS Over tHe lazY DOg"
var output = ""
for chr in string {
var str = String(chr)
if str.lowercaseString != str {
output += str
}
}
print(output)
>>> TBWOXSOHYDO
通过扩展String
和Character
,我认为我已经达到了一个相当灵活的解决方案,完全(?)Unicode意识。下面的语法适用于Swift 3.0。虽然在Swift 2.x中没有什么是不可能的
extension String {
func isUppercased(at: Index) -> Bool {
let range = at..<self.index(after: at)
return self.rangeOfCharacter(from: .uppercaseLetters, options: [], range: range) != nil
}
}
extension Character {
var isUppercase: Bool {
let str = String(self)
return str.isUppercased(at: str.startIndex)
}
}
let str = "AaÀàΓγ!2😂🇺🇸"
let uppercase = str.characters.filter({ $0.isUppercase }) // ["A", "À", "Γ"]
for char in str.characters {
"(char): (char.isUppercase)"
}
// A: true
// a: false
// À: true
// à: false
// Γ: true
// γ: false
// !: false
// 2: false
// 😂: false
// 🇺🇸: false
这些扩展的TODO是在Character
上重构isUppercase
以不转换为String
。
在Swift 3中,我做了这样的事情
import UIKit
...
let ch = "A".unicodeScalars.first!
let is_ch_upperCase = CharacterSet.uppercaseLetters.contains(ch)
SWIFT 4:
你可以简单地不需要所有其他花哨的东西,除非你要检查数字或unicode标量等:
extension String {
var isLowercase: Bool {
return self == self.lowercased()
}
var isUppercase: Bool {
return self == self.uppercased()
}
}
更简洁,但可能比循环慢:
let str = "The quick BroWn fOX jumpS Over tHe lazY DOg"
let nonUpperCase = NSCharacterSet.uppercaseLetterCharacterSet().invertedSet
let letters = str.componentsSeparatedByCharactersInSet(nonUpperCase)
"".join(letters) // "TBWOXSOHYDO"
在Bob Prystaneks函数的基础上展开,你可以扩展Swift的"Character"类。只需将以下扩展名放在代码中的任何位置,现在您可以询问任何字符是否大写。
extension Character
{
public func isUpper() -> Bool
{
let characterString = String(self)
return (characterString == characterString.uppercaseString) && (characterString != characterString.lowercaseString)
}
}
简单扩展接受任何CharacterSet
检查:
extension String {
func hasCharacter(in characterSet: CharacterSet) -> Bool {
return rangeOfCharacter(from: characterSet) != nil
}
}
用法:
"aBc".hasCharacter(in: .lowercaseLetters)
"aBc".hasCharacter(in: .uppercaseLetters)
"aBc".hasCharacter(in: <#AnyOtherCharacterSetYouWant#>)
添加这个Swift扩展,这样字符类的所有实例都有两个新函数:isUpperCase()测试字符是否是大写的,isLowerCase()测试字符是否是小写的。该实现只是检查字符实例是否在所需的集合中。
extension Character {
func isUpperCase() -> Bool {
return CharacterSet.uppercaseLetters.contains(self.unicodeScalars.first!)
}
func isLowerCase() -> Bool {
return CharacterSet.lowercaseLetters.contains(self.unicodeScalars.first!)
}
}
let string = "The quick BroWn fOX jumpS Over tHe lazY DOg"
for (_,ch) in string.enumerated() {
if ch.isUppercase {
//uppercase
} else {
//lowercase: ch.isLowercase
}
}
迅速4枚举一个字符串并获取字符的ascii码,然后进行比较。
的ascii码→97 b ->98…
→65 B ->66…
let string = "The quick BroWn fOX jumpS Over tHe lazY DOg"
for (_,ch) in string.enumerated() {
let chValue = String(ch).unicodeScalars
let asciiValue = chValue[chValue.startIndex].value
if asciiValue >= 97 {
//lowercase
} else {
//uppercase
}
}
正如其他人所评论的那样,仅使用uppercaseString或lowercaseString不会考虑"非alpha"字符。
这就是我实现isupper的方式。只有当一个字符不等于它的小写字母时,它才是大写字母。
func isupper(c:Character) -> Bool
{
let cs = String(c)
return (cs == cs.uppercaseString) && (cs != cs.lowercaseString)
}
创建并使用这个扩展:
extension Character {
var isUppercase: Bool {
guard self.asciiValue != nil else {
return false
}
return self.asciiValue! >= Character("A").asciiValue! &&
self.asciiValue! <= Character("Z").asciiValue!
}
var asciiValue: UInt32? {
return String(self).unicodeScalars.first?.value
}
}
每个字符都可以表示一个UTF或Unicode值(8/16/21 Bit):
例如:UTF-8 "Dog!": 68, 111, 103, 33
Unicode (Dog Face): U+1F436
如果你想检查大小写,你可以匹配UTF范围
(PS:注意不同的UTF-XX/Unicode格式)
创建并使用这个扩展:
extension Character {
var isUppercase: Bool {
return (String(self).unicodeScalars.filter {
$0.value >= "A".unicodeScalars.first!.value &&
$0.value <= "Z".unicodeScalars.first!.value
}).count != 0
}
}
Swift 3:
var str = "Hello"
let upperChars = str.unicodeScalars.flatMap({ char in
CharacterSet.uppercaseLetters.contains(char) ? char : nil
})
let lowerChars = str.unicodeScalars.flatMap({ char in
CharacterSet.lowercaseLetters.contains(char) ? char : nil
})
// upperChars -> ["H"]
// lowerChars -> ["e", "l", "l", "o"]
Simple Swifty extension:
extension String {
var isLower: Bool {
return String(self.filter { String($0) == String($0).lowercased() }) == self
}
}
检查字符串是否包含大写,小写或特殊字符:
let lowerCase = CharacterSet.lowercaseLetters
let upperCase = CharacterSet.uppercaseLetters
let numbers = CharacterSet.decimalDigits
let containsNumbers = text.unicodeScalars.contains(where: { numbers.contains($0) })
let containsLowerCase = text.unicodeScalars.contains(where: { lowerCase.contains($0) })
let containsUpperCase = text.unicodeScalars.contains(where: { upperCase.contains($0) })
let containsSpecial = text.unicodeScalars.contains(where: { !lowerCase.contains($0) && !upperCase.contains($0) && !numbers.contains($0) })