Как разбить строку, но сохранить разделители как отдельные элементы - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть несколько строк, которые включают различные символы, такие как следующие два примера:

z=y+x

@symbol

, и я хочу разбить строки так, чтобы у меня были результирующие фрагменты:

[z = y + x]

[@ symbol]

Несколько вещей, на которые я посмотрел и попробовал:

  1. Я смотрел на этот вопрос , но кажется, что golang не поддерживает lookarounds .

  2. Я знаю, что решение существует с использованием strings.SplitAfter, но я хочу использовать разделители в качестве отдельных элементов.

  3. Я попытался заменить символ (например, «+») на какой-либо вариант (например, «~ + ~») и выполнить разбиение на окружающие символы (например, «~»), но это решение далеко не элегантный и сталкивается с проблемами, если мне нужно сделать условную замену в зависимости от символа (, который golang не поддерживает ни ).

Возможно, я неправильно понял некоторые из предыдущих вопросов и их соответствующие решения.

1 Ответ

1 голос
/ 01 апреля 2020

Я использовал модифицированную версию строк 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, которую я связал, заранее рассчитывает длину выходного массива, это хорошая оптимизация, которую я Я решил опустить, но, вероятно, было бы хорошо добавить обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...