How to split a string on multiple single‑character delimiters (and keep them) in Swift

1 Answer

0 votes
import Foundation

func splitKeepDelims(_ s: String, delimiters: String) -> [String] {
    // Build regex: e.g. ",;|" → "([,;|])"
    let escaped = NSRegularExpression.escapedPattern(for: delimiters)
    let pattern = "([\(escaped)])"

    let regex = try! NSRegularExpression(pattern: pattern)
    let nsString = s as NSString
    let matches = regex.matches(in: s, range: NSRange(location: 0, length: nsString.length))

    var result: [String] = []
    var lastEnd = 0

    for m in matches {
        let start = m.range.location
        let end = m.range.location + m.range.length

        // Add text before delimiter
        if start > lastEnd {
            result.append(nsString.substring(with: NSRange(location: lastEnd, length: start - lastEnd)))
        }

        // Add the delimiter itself
        result.append(nsString.substring(with: m.range))

        lastEnd = end
    }

    // Add remaining text after last delimiter
    if lastEnd < nsString.length {
        result.append(nsString.substring(with: NSRange(location: lastEnd, length: nsString.length - lastEnd)))
    }

    return result
}

let input = "aa,bbb;cccc|ddddd"
let parts = splitKeepDelims(input, delimiters: ",;|")

for p in parts {
    print("[\(p)]", terminator: " ")
}



/*
run:

[aa] [,] [bbb] [;] [cccc] [|] [ddddd] 

*/

 



answered Mar 9 by avibootz

Related questions

...