Я использовал модифицированную версию строк Go. Разделенная реализация https://golang.org/src/strings/strings.go?s=7505: 7539 # L245
func Test(te *testing.T) {
t := tester.New(te)
t.Assert().Equal(splitCharsInclusive("z=y+x", "=+"), []string{"z", "=", "y", "+", "x"})
t.Assert().Equal(splitCharsInclusive("@symbol", "@"), []string{"", "@", "symbol"})
}
func splitCharsInclusive(s, chars string) (out []string) {
for {
m := strings.IndexAny(s, chars)
if m < 0 {
break
}
out = append(out, s[:m], s[m:m+1])
s = s[m+1:]
}
out = append(out, s)
return
}
Это ограничено разделением на отдельные символы. И передача что-то вроде splitCharsInclusive("(z)(y)(x)", "()")
может не дать вам желаемого результата, так как вы получите несколько пустых строк в ответе. Но, надеюсь, это хорошая отправная точка для необходимых вам модификаций.
Кроме того, версия Go, которую я связал, заранее рассчитывает длину выходного массива, это хорошая оптимизация, которую я Я решил опустить, но, вероятно, было бы хорошо добавить обратно.