如何用swift识别字符串中的大写和小写字符?

yey*_*eyo 29 swift

这是我到目前为止(测试目的):

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)
}
Run Code Online (Sandbox Code Playgroud)

我该如何测试大写和小写字符?

我知道我可以从swift调用C函数,但这对我来说似乎不正确.我怎么能用swift做到这一点?

gui*_*dos 21

我不确定你试图避免使用C函数是什么意思.我希望这不包括避免在开发应用程序时OS X和iOS为您提供的框架和基础库,例如NSCharacterSet类,它在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.")
  }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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.")
    }
}
Run Code Online (Sandbox Code Playgroud)


Joa*_*son 18

您总是可以看到小写表示是否与当前值不同;

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
Run Code Online (Sandbox Code Playgroud)

  • 这很疯狂,所有普通语言都检查char是上/下.数字和其他类别的字符怎么样?(对不起,咆哮) (5认同)

Tha*_*ham 11

在 Swift 5 中,我们现在可以根据 Unicode 标准检查字符属性

对于你的问题,chr.isUppercase并且chr.isLowercase是答案。


Rya*_*yan 9

通过扩展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
Run Code Online (Sandbox Code Playgroud)

TODO这些扩展是重构isUppercaseCharacter不转换到String.


And*_*oid 6

环球银行金融电信协会4:

除非您要检查数字或 unicode 标量等,否则您可以不需要所有其他花哨的东西:

extension String {

   var isLowercase: Bool {
       return self == self.lowercased()
   }

   var isUppercase: Bool {
       return self == self.uppercased()
   }

}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ing 5

更干净,但可能比循环慢:

let str = "The quick BroWn fOX jumpS Over tHe lazY DOg"
let nonUpperCase = NSCharacterSet.uppercaseLetterCharacterSet().invertedSet
let letters = str.componentsSeparatedByCharactersInSet(nonUpperCase)
"".join(letters) // "TBWOXSOHYDO"
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

在Swift 3中,我做了这样的事情

import UIKit
...
let ch = "A".unicodeScalars.first!
let is_ch_upperCase = CharacterSet.uppercaseLetters.contains(ch)
Run Code Online (Sandbox Code Playgroud)