fn split_and_keep(text: &str, delims: &[char]) -> Vec<String> {
if text.is_empty() {
return Vec::new();
}
let delim_set: std::collections::HashSet<char> =
delims.iter().cloned().collect();
let chars: Vec<char> = text.chars().collect();
let mut result = Vec::new();
let mut start = 0;
for i in 1..chars.len() {
let prev = chars[i - 1];
let curr = chars[i];
let prev_is_delim = delim_set.contains(&prev);
let curr_is_delim = delim_set.contains(&curr);
let should_split =
(prev_is_delim != curr_is_delim) || // text ↔ delim
(prev_is_delim && curr_is_delim && prev != curr); // delim type changed
if should_split {
let segment: String = chars[start..i].iter().collect();
result.push(segment);
start = i;
}
}
// Add final segment
let segment: String = chars[start..].iter().collect();
result.push(segment);
result
}
fn main() {
let s = "aa==bbb---cccc++++ddddd";
let delims = ['=', '-', '+'];
let parts = split_and_keep(s, &delims);
for p in parts {
print!("[{}] ", p);
}
}
/*
run:
[aa] [==] [bbb] [---] [cccc] [++++] [ddddd]
*/