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)
我搜索了文档和其他网站,但我没有找到任何有用的东西.我在最后.我不知道该怎么做更多因此我真的很新.它仍然只给我资本,我不知道如何改变,它也给了我第一资本背后的东西.
(斯威夫特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)
功能编程风格的另一种解决方案
首先,我们定义一个简单的方法来检查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)
使用正则表达式 -
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)
| 归档时间: |
|
| 查看次数: |
1661 次 |
| 最近记录: |