Splitting a string in swift using multiple delimiters Splitting a string in swift using multiple delimiters swift swift

Splitting a string in swift using multiple delimiters


One can also use the following approach to split a string with multiple delimiters in case keys are single characters:

//swift 4+let stringData = "K01L02M03"let res = stringData.components(separatedBy: CharacterSet(charactersIn: "KLM"))//older swift syntaxlet res = stringData.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: "KLM"));

res will contain ["01", "02", "03"]

If anyone knows any kind of special syntax to extend the approach to multiple characters per key you are welcome to suggest and to improve this answer


Swift 4.2 update to @vir us's answer:

let string = "dots.and-hyphens"let array = string.components(separatedBy: CharacterSet(charactersIn: ".-"))


This isn't very efficient, but it should do the job:

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

Or, if you wanted it in dictionary form:

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

For Swift 2:

import Foundationextension 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] }  }}