use regex::Regex;
fn split_keep_delims(s: &str, delimiters: &str) -> Vec<String> {
// Build regex: e.g. ",;|" → "([,;|])"
let pattern = format!("([{}])", regex::escape(delimiters));
let re = Regex::new(&pattern).unwrap();
let mut result = Vec::new();
let mut last_end = 0;
for m in re.find_iter(s) {
let start = m.start();
let end = m.end();
// Add text before delimiter
if start > last_end {
result.push(s[last_end..start].to_string());
}
// Add the delimiter itself
result.push(s[start..end].to_string());
last_end = end;
}
// Add remaining text after last delimiter
if last_end < s.len() {
result.push(s[last_end..].to_string());
}
result
}
fn main() {
let input = "aa,bbb;cccc|ddddd";
let parts = split_keep_delims(input, ",;|");
for p in parts {
print!("[{}] ", p);
}
}
/*
run:
[aa] [,] [bbb] [;] [cccc] [|] [ddddd]
*/