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]
*/