package main
import (
"fmt"
)
func splitAndKeep(text string, delims map[rune]bool) []string {
if len(text) == 0 {
return []string{}
}
var result []string
start := 0
for i := 1; i < len(text); i++ {
prev := rune(text[i-1])
curr := rune(text[i])
prevIsDelim := delims[prev]
currIsDelim := delims[curr]
shouldSplit :=
(prevIsDelim != currIsDelim) || // text ↔ delim
(prevIsDelim && currIsDelim && prev != curr) // delim type changed
if shouldSplit {
result = append(result, text[start:i])
start = i
}
}
// Add final segment
result = append(result, text[start:])
return result
}
func main() {
s := "aa==bbb---cccc++++ddddd"
delims := map[rune]bool{
'=': true,
'-': true,
'+': true,
}
parts := splitAndKeep(s, delims)
for _, p := range parts {
fmt.Printf("[%s] ", p)
}
}
/*
run:
[aa] [==] [bbb] [---] [cccc] [++++] [ddddd]
*/