как заменить n-е вхождение в Go - PullRequest
0 голосов
/ 28 января 2020

как заменить забавную c функцию (s, old, new [] bytes, n int) [] bytes, которая, учитывая три среза байтов s, old, new и целое число n, возвращает срез соответствующий s, в котором n-ое вхождение старого заменено новым. Если это вхождение не существует, функция возвращает s, не изменяя его? спасибо


import (

    "fmt"
    "os"
    "strconv"
)

func main() {
    s := os.Args[1]
    old := os.Args[2]
    new := os.Args[3]
    n, _ := strconv.Atoi(os.Args[4])
    fmt.Println(s)
    replaced := replace([]byte(s), []byte(old), []byte(new), n)
    fmt.Println(string(replaced))
}

func replace(s, old, new []byte, i int) (replaced []byte) {

}```

1 Ответ

0 голосов
/ 28 января 2020

Вы можете попробовать использовать комбинацию bytes.SplitAfter, которая разделит вашу исходную строку после разделителя (старого для вас), bytes.Replace() на элементе N вашего среза, а затем, bytes.Join, чтобы повторно составьте исходную строку.

Вы должны проверить документацию , которая довольно ясна:)

package main

import (
    "bytes"
    "fmt"
)

func main() {
    str := []byte("oink oink oink oink")
    old := []byte("k")
    new := []byte("X")

    splitedStr := bytes.SplitAfter(str, old)
    splitedStr[2] = bytes.Replace(splitedStr[2], old, new, -1)


    fmt.Printf("%s", bytes.Join(splitedStr, []byte("")))
}

...