用大写字母拆分Swift中的字符串

And*_*ndi 8 arrays string split swift

我想将一个简单的String用大写字母分成一个数组.它应该看起来像这样:

let teststring = "NaCuHHe"
Run Code Online (Sandbox Code Playgroud)

结果应该是:

["Na", "Cu", "H", "He"]
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

func capitalLetters(s: String) -> [Character] {
    return s.characters.filter { ("A"..."Z").contains($0) }
}
Run Code Online (Sandbox Code Playgroud)

我搜索了文档和其他网站,但我没有找到任何有用的东西.我在最后.我不知道该怎么做更多因此我真的很新.它仍然只给我资本,我不知道如何改变,它也给了我第一资本背后的东西.

dfr*_*fri 7

(斯威夫特3)

我们可以让自己受到split函数Sequence实现的启发,并实现我们自己的splitBefore方法(在分隔符之前拆分,省略空子序列),使分隔符保持在拆分序列中.

extension Sequence {
    func splitBefore(
        separator isSeparator: (Iterator.Element) throws -> Bool
    ) rethrows -> [AnySequence<Iterator.Element>] {
        var result: [AnySequence<Iterator.Element>] = []
        var subSequence: [Iterator.Element] = []

        var iterator = self.makeIterator()
        while let element = iterator.next() {
            if try isSeparator(element) {
                if !subSequence.isEmpty {
                    result.append(AnySequence(subSequence))
                }
                subSequence = [element]
            }
            else {
                subSequence.append(element)
            }
        }
        result.append(AnySequence(subSequence))
        return result
    }
}
Run Code Online (Sandbox Code Playgroud)

使用如下

/* help property */
extension Character {
    var isUpperCase: Bool { return String(self) == String(self).uppercased() }
}

/* example usage */  
let teststring = "NaCuHHe"
let splitted = teststring
    .characters
    .splitBefore(separator: { $0.isUpperCase })
    .map{String($0)}
print(splitted) // ["Na", "Cu", "H", "He"]
Run Code Online (Sandbox Code Playgroud)


Luc*_*tti 6

功能编程风格的另一种解决方案

isUppercase

首先,我们定义一个简单的方法来检查Character是否为大写

extension Character {
    var isUppercase: Bool { return String(self).uppercased() == String(self) }
}
Run Code Online (Sandbox Code Playgroud)

索引

接下来我们需要大写字符的索引

let indexes = Set(text
    .characters
    .enumerated()
    .filter { $0.element.isUppercase }
    .map { $0.offset })
Run Code Online (Sandbox Code Playgroud)

建立结果

现在我们可以建立结果了

let chunks = text
    .characters
    .map { String($0) }
    .enumerated()
    .reduce([String]()) { chunks, elm -> [String] in
        guard !chunks.isEmpty else { return [elm.element] }
        guard !indexes.contains(elm.offset) else { return chunks + [String(elm.element)] }

        var chunks = chunks
        chunks[chunks.count-1] += String(elm.element)
        return chunks
    }
Run Code Online (Sandbox Code Playgroud)

产量

["Na", "Cu", "H", "He"]
Run Code Online (Sandbox Code Playgroud)


Abh*_*ngh 5

使用正则表达式 -

func splitYourString(_ s: String) ->[String] {
let regex = try! NSRegularExpression(pattern: "([a-z]*)([A-Z])") //<-Use capturing, `([a-z]*)`->$1, `([A-Z])`->$2
return regex.stringByReplacingMatches(in: s, range: NSRange(0..<s.utf16.count),
                                      withTemplate: "$1 $2").trimmingCharacters(in: .whitespacesAndNewlines) .components(separatedBy: " ")
}
print(splitYourString("NaCuHHe"))     //["Na", "Cu", "H", "He"]
Run Code Online (Sandbox Code Playgroud)