Swift - 仅从String获取字母

时间:2018-05-19 12:38:38

标签: swift

我正试图从Swift中的String中获取字母。

例如:

let str = "he4ll5663#$#0o"
print(str.letters) // prints hello

3 个答案:

答案 0 :(得分:4)

以下是使用filter的{​​{1}}上的unicodeScalars执行此操作的方法:

String

感谢@MartinR,建议您通过将extension String { var letters: String { return String(unicodeScalars.filter(CharacterSet.letters.contains)) } } let str = "he4ll5663#$#0o" print(str.letters) // hello 更改为first!的{​​{1}}来避免使用filter(在我的原始回答中)。

答案 1 :(得分:1)

所以我无法在网络上找到它,所以我会发布我的回答,希望它能帮助任何人:

extension String {

    var letters: String {
        return components(separatedBy: CharacterSet.letters.inverted)
            .joined()
    }

}

干杯

答案 2 :(得分:1)

extension StringProtocol {
    var letters: String {
        return String(compactMap {
            guard let unicodeScalar = $0.unicodeScalars.first else { return nil }
            return CharacterSet.letters.contains(unicodeScalar) ? $0 : nil
        })
    }
}

let str = "He4ll5663#$#0o"
print(str.letters)           // Hello

let str1 = "a \u{301}b"
str1.letters                 // "ab"

let str2 = "Español teléfono"
print(str2.letters)           // Españolteléfono

Swift 4.2

extension StringProtocol where Self: RangeReplaceableCollection {
    mutating func removeNonLetters() {
        removeAll {
            guard let unicodeScalar = $0.unicodeScalars.first else { return false }
            return !CharacterSet.letters.contains(unicodeScalar)
        }
    }
    var letters: Self {
        var letters = self
        letters.removeNonLetters()
        return letters
    }
}

var str3 = "a \u{301}b"
str3.letters              // "ab"
str3                      // "a ́b"
str3.removeNonLetters()   // "ab"
str3                      // "ab"