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