Golang用string中的数组元素替换数组元素

时间:2016-12-29 23:21:00

标签: php arrays string go replace

在PHP中我们可以做类似的事情:

$result = str_replace($str,$array1,$array2);

其中$ array1和$ array2是元素数组,这使得php用array2元素替换所有array1元素。 使用Golang有没有相同的东西?我尝试过相同的php方法,但它不起作用:

str := "hello world"
array1 :=  []string {"hello","world"}
array2 :=  []string {"foo","bar"}
r := strings.NewReplacer(array1,array2)
str = r.Replace(str)

我知道我可以这样做:

str := "hello world"
array1 :=  []string {"hello","world"}
array2 :=  []string {"foo","bar"}
r := strings.NewReplacer("hello","foo","world","bar")
str = r.Replace(str)

这样可行,但我需要直接使用数组,因为将动态创建替换数组。

3 个答案:

答案 0 :(得分:4)

我相信如果你首先在一个替换数组中压缩两个数组,然后在目标字符串上只运行一个替换器传递,性能会好得多,因为strings.Replacer针对各种情况进行了相当优化,因为替换算法需要只运行一次。

这样的事情可以做到:

func zip(a1, a2 []string) []string {
    r := make([]string, 2*len(a1))
    for i, e := range a1 {
        r[i*2] = e
        r[i*2+1] = a2[i]
    }
    return r
}

func main() {
    str := "hello world"
    array1 := []string{"hello", "world"}
    array2 := []string{"foo", "bar"}
    str = strings.NewReplacer(zip(array1, array2)...).Replace(str)
    fmt.Println(str)
}

答案 1 :(得分:0)

我找到的解决方案如下:

str := "hello world"
array1 :=  []string {"hello","world"}
array2 :=  []string {"foo","bar"}

for i,toreplace := range array1{
    r := strings.NewReplacer(toreplace,array2[i])
    str = r.Replace(str)
}

fmt.Println(str)

可以创建一个功能

func str_replace(str string, original []string, replacement []string) string {

    for i,toreplace := range original{
        r := strings.NewReplacer(toreplace,replacement[i])
        str = r.Replace(str)
    }

    return str
}

用法:

str := "hello world"
array1 :=  []string {"hello","world"}
array2 :=  []string {"foo","bar"}
str = str_replace(str,array1,array2)
fmt.Println(str)

任何更优雅的解决方案都非常受欢迎。

答案 2 :(得分:0)

地图怎么样?

str := "Lorem Ipsum is simply dummy. Lorem Ipsum is text of the printing. Lorem Ipsum is typesetting industry.";

replace := map[string]string{
    "Lorem": "LoremReplaced",
    "Ipsum": "IpsumReplaced",
    "printing": "printingReplaced",
}

for s, r := range replace {
    str = strings.Replace(str, s, r, -1)
}