Strings.Replacer:如何一次替换所有子串?

时间:2015-12-11 02:14:25

标签: string replace go

我正在尝试使用Replacer从字符串中替换多个不同的字符,但是在替换一个字符串时遇到问题。输出有两个下划线而不是一个,如果我尝试使用其他Replacer替换,那么它不能完全替换它。

尝试Go Playground上的代码:

package main

import (
    "fmt"
    "strings"
    )

//Expecting output to be emp_my_stats

func main() {
    var input string = "/v1.0/emp/emp_1/my_stats"

    replacer := strings.NewReplacer("/v1.0/", "", "/", "_", "emp_1", "")
//  replacer := strings.NewReplacer("/v1.0/", "", "/", "_", "/emp_1", "")

    output := replacer.Replace(input)
    fmt.Printf("output %v", output) 
}

我可以使用多个Replacer等但是真的想在一次通过/或一次声明中这样做。

有什么建议干净利落的吗?我的目标是提高效率(这将经常进行,尽管这些字符串很短很重要),也不使用多个Replacer

2 个答案:

答案 0 :(得分:5)

您还没有指定任何其他可能的输入,但它看起来是这样的:

input := "/v1.0/emp/emp_1/my_stats"

您需要使用下划线"emp"连接的"my_stats"'_'部分。根据您对替换者的尝试判断,"/v1.0/""/emp_1/"部分是静态的,因此您可以使用一个替换器执行此操作:

replacer := strings.NewReplacer("/v1.0/", "", "/emp_1/", "_")

完整示例:

input := "/v1.0/emp/emp_1/my_stats"

replacer := strings.NewReplacer("/v1.0/", "", "/emp_1/", "_")

output := replacer.Replace(input)
fmt.Println("Output:", output)

输出(在Go Playground上尝试):

Output: emp_my_stats

备注:

你提到你必须经常这样做,你希望这是有效的。因此,请确保只创建一个Replacer,并在需要进行替换时重复使用它(例如,您可以将其存储在初始化一次的全局变量中)。根据您的输入判断,它看起来像是某个URL的路径,并且您最希望这样做的是HTTP处理程序,它可以在多个goroutine上并发运行。使用来自多个goroutines的Replacer是安全的,引用Replacer的文档:

  

多个goroutine可以安全地同时使用。

备注#2:

如果输入中的"/v1.0/""/emp_1/"部分不是静态的,您无法使用Replacer真正解决问题。在这种情况下,您可以使用正则表达式或作为更有效的解决方案,将字符串拆分为'/'并使用'_'加入相关部分。

答案 1 :(得分:2)

strings.Split可能会达到你想要的效果:

package main

import (
    "fmt"
    "strings"
)

//Expecting output to be emp_my_stats

func main() {

    input := "/v1.0/emp/emp_1/my_stats"
    xs := strings.Split(input, "/")
    fmt.Println(xs)
    fmt.Println(xs[4])
    fmt.Println(xs[3] + xs[4])
    fmt.Println(xs[3][:4] + xs[4])
    fmt.Println(xs[3][:len(xs[3])-1] + xs[4])
}

以上产生了这个输出:

[ v1.0 emp emp_1 my_stats]
my_stats
emp_1my_stats
emp_my_stats
emp_my_stats

您可以在此处查看go playground.