使用多个分隔符在swift中拆分字符串

Ric*_*ick 7 string split ios swift

我试图使用多个分隔符或Apple调用它们的分隔符在Swift(1.2)中拆分(或爆炸)一个字符串.

我的字符串看起来像这样:

KEY1=subKey1=value&subkey2=valueKEY2=subkey1=value&subkey2=valueKEY3=subKey1=value&subkey3=value
Run Code Online (Sandbox Code Playgroud)

我已将其格式化以便于阅读:

KEY1=subKey1=value&subkey2=value
KEY2=subkey1=value&subkey2=value
KEY3=subKey1=value&subkey3=value
Run Code Online (Sandbox Code Playgroud)

大写的"KEY"是预定义的名称.
我试图这样做:

var splittedString = string.componentsSeparatedByString("KEY1")
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的,我只能用一个KEY作为分隔符,所以我正在寻找这样的东西:

var splittedString = string.componentsSeperatedByStrings(["KEY1", "KEY2", "KEY3"])
Run Code Online (Sandbox Code Playgroud)

结果将是:

[
  "KEY1" => "subKey1=value&subkey2=value",
  "KEY2" => "subkey1=value&subkey2=value",
  "KEY3" => "subkey1=value&subkey2=value"
]
Run Code Online (Sandbox Code Playgroud)

我可以使用Swift 1.2内置的东西吗?或者是否有某种扩展/库可以轻松地做到这一点?

谢谢你的时间,祝你有个美好的一天!

vir*_* us 13

如果键是单个字符,也可以使用以下方法拆分具有多个分隔符的字符串:

//swift 4+
let stringData = "K01L02M03"
let res = stringData.components(separatedBy: CharacterSet(charactersIn: "KLM"))

//older swift syntax
let res = stringData.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "KLM"));
Run Code Online (Sandbox Code Playgroud)

res 将包含 ["01", "02", "03"]

如果有人知道任何一种特殊的语法来扩展每个键的多个字符的方法,欢迎你建议并改进这个答案


Car*_*ess 7

雨燕4.2更新@ VIR我们的回答

let string = "dots.and-hyphens"
let array = string.components(separatedBy: CharacterSet(charactersIn: ".-"))
Run Code Online (Sandbox Code Playgroud)


Bol*_*ose 6

Swift在这里提供了一个新的 split 函数

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(whereSeparator: { $0 == " " || $0 == "."}))
Run Code Online (Sandbox Code Playgroud)


ois*_*sdk 4

这不是很有效,但它应该可以完成工作:

import Foundation

extension String {
  func componentsSeperatedByStrings(ss: [String]) -> [String] {
    let inds = ss.flatMap { s in
      self.rangeOfString(s).map { r in [r.startIndex, r.endIndex] } ?? []
    }
    let ended = [startIndex] + inds + [endIndex]
    let chunks = stride(from: 0, to: ended.count, by: 2)
    let bounds = map(chunks) { i in (ended[i], ended[i+1]) }
    return bounds
      .map { (s, e) in self[s..<e] }
      .filter { sl in !sl.isEmpty }
  }
}



"KEY1=subKey1=value&subkey2=valueKEY2=subkey1=value&subkey2=valueKEY3=subKey1=value&subkey3=value".componentsSeperatedByStrings(["KEY1", "KEY2", "KEY3"])

// ["=subKey1=value&subkey2=value", "=subkey1=value&subkey2=value", "=subKey1=value&subkey3=value"]
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要字典形式:

import Foundation

extension String {
  func componentsSeperatedByStrings(ss: [String]) -> [String:String] {
    let maybeRanges = ss.map { s in self.rangeOfString(s) }
    let inds   = maybeRanges.flatMap { $0.map { r in [r.startIndex, r.endIndex] } ?? [] }
    let ended  = [startIndex] + inds + [endIndex]
    let chunks = stride(from: 0, to: ended.count, by: 2)
    let bounds = map(chunks) { i in (ended[i], ended[i+1]) }
    let values = bounds
      .map { (s, e) in self[s..<e] }
      .filter { sl in !sl.isEmpty }
    let keys = filter(zip(maybeRanges, ss)) { (r, _) in r != nil }
    var result: [String:String] = [:]
    for ((_, k), v) in zip(keys, values) { result[k] = v }
    return result
  }
}


"KEY1=subKey1=value&subkey2=valueKEY2=subkey1=value&subkey2=valueKEY3=subKey1=value&subkey3=value".componentsSeperatedByStrings(["KEY1", "KEY2", "KEY3"])

// ["KEY3": "=subKey1=value&subkey3=value", "KEY2": "=subkey1=value&subkey2=value", "KEY1": "=subKey1=value&subkey2=value"]
Run Code Online (Sandbox Code Playgroud)

对于斯威夫特 2:

import Foundation

extension String {
  func componentsSeperatedByStrings(ss: [String]) -> [String] {
    let unshifted = ss
      .flatMap { s in rangeOfString(s) }
      .flatMap { r in [r.startIndex, r.endIndex] }
    let inds  = [startIndex] + unshifted + [endIndex]
    return inds.startIndex
      .stride(to: inds.endIndex, by: 2)
      .map { i in (inds[i], inds[i+1]) }
      .flatMap { (s, e) in s == e ? nil : self[s..<e] }
  }
}
Run Code Online (Sandbox Code Playgroud)