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

40
这是我目前为止的进展(仅用于测试):
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完成此操作?


你想对结果做什么?获取一个包含所有大写字符的字符串吗? - Joachim Isaksson
不。我想知道如何测试大写和小写字符。我提供了一个例子以便完整。 - yeyo
2
这里有什么问题?是 isupper 函数调用吗?如果你只是想知道字符串中是否有大写字符,也许可以用 if string.lowercaseString == string - Jack
18个回答

2

Swift 5

使用字符属性进行检查

let string = "The quick BroWn fOX jumpS Over tHe lazY DOg"
for (_,ch) in string.enumerated() {
    if ch.isUppercase {
         //uppercase
   } else {
        //lowercase: ch.isLowercase
   }
}

Swift 4 枚举字符串并获取字符的ASCII码,然后进行比较。

字符的ASCII码为

a -> 97 b -> 98 ...

A -> 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
    }
}

1

正如其他人所评论的,仅使用uppercaseString或lowercaseString不能考虑“非字母”字符。

这是我实现isupper的方式。只有当一个字符不等于它的小写时,它才是大写。

func isupper(c:Character) -> Bool
{
    let cs = String(c)
    return (cs == cs.uppercaseString) && (cs != cs.lowercaseString)
}

1
创建并使用此扩展:

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
    }
}

我认为这可能是适用于5之前版本的一个好方法。 - Kross

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"]

0

简单的 Swifty 扩展:

extension String {
    var isLower: Bool {
        return String(self.filter { String($0) == String($0).lowercased() }) == self
    }
}

0

检查字符串是否包含大写字母、小写字母或特殊字符:

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) })

0
每个字符都可以表示为UTF或Unicode值(8/16/21位):
例如:
UTF-8 "Dog!": 68, 111, 103, 33
Unicode (Dog Face): U+1F436

如果你想检查大小写,可以匹配UTF范围。

(PS:注意不同的UTF-XX / Unicode格式)


所有可能语言的UTF范围是什么?同时,祝你好运处理UTF-8编码中宽于1个字节的范围和字符。 - Andrey
什么意思?如果需要更多,所有字符都可以用32(21)位Unicode表示!http://unicode-table.com/de/#control-character - Javatar
我的意思是你的建议并不真正有用。首先,你为什么要提到UTF呢?你甚至没有指定是哪个UTF,8还是16或32。(UTF "Dog!" 是UTF-8)。第二个问题是检查范围并不是一个真正的选项,因为除了英语/拉丁文之外,还有很多其他的语言/文字。 - Andrey
这是另一次尝试。您可以指定自己所需的范围。中文和其他语言甚至没有大小写字母(单词)。但我同意,也许对于这种情况来说这太笨重了。 - Javatar

0

创建并使用此扩展:

extension Character {
        var isUppercase: Bool {
            return (String(self).unicodeScalars.filter {
                $0.value >= "A".unicodeScalars.first!.value &&
                $0.value <= "Z".unicodeScalars.first!.value
            }).count != 0
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接