替换字符串中特定位置的字符

时间:2018-06-18 15:52:46

标签: go

我知道方法string.Replace()。如果您确切知道要替换的内容及其出现,它就会起作用。但是如果我想在一个已知位置替换一个字符,我该怎么办?我想到这样的事情:

randLetter := getRandomChar()

myText := "This is my text"

randPos :=  rand.Intn(len(myText) - 1)

newText := [:randPos] + randLetter + [randPos + 1:]

但是这不会替换randPos处的字符,只需在该位置插入randLetter即可。正确?

3 个答案:

答案 0 :(得分:1)

我编写了一些代码,将indexofcharacter处的字符替换为replacement。我可能不是最好的方法,但是效果很好。

https://play.golang.org/p/9CTgHRm6icK

func replaceAtPosition(originaltext string, indexofcharacter int, replacement string) string {
    runes := []rune(originaltext )
    partOne := string(runes[0:indexofcharacter-1])
    partTwo := string(runes[indexofcharacter:len(runes)])
    return partOne + replacement + partTwo
}

答案 1 :(得分:0)

UTF-8是一种可变长度编码。例如,

package main

import "fmt"

func insertChar(s string, c rune, i int) string {
    if i >= 0 {
        r := []rune(s)
        if i < len(r) {
            r[i] = c
            s = string(r)
        }
    }
    return s
}

func main() {
    s := "Hello, 世界"
    fmt.Println(s)
    s = insertChar(s, 'X', len([]rune(s))-1)
    fmt.Println(s)
}

输出:

Hello, 世界
Hello, 世X

答案 2 :(得分:0)

string是一个只读的字节切片。你不能替换任何东西。

单个Rune可以包含多个字节。因此,无论如何,您应该将string转换为Runes的(中间)可变切片:

myText := []rune("This is my text")
randPos := rand.Intn(len(myText) - 1)
myText[randPos] = randLetter
fmt.Println(string(myText))