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

Gau*_*nha 4 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) 
}
Run Code Online (Sandbox Code Playgroud)

我可以使用多个Replacer等但是真的想在一个通道/或一个语句中执行它.

有什么建议干净利落的吗?我的目标是提高效率(这将经常完成,虽然这些字符串很短很重要),也不会使用多个Replacers.

icz*_*cza 7

您尚未指定任何其他可能的输入,但它看起来如下:

input := "/v1.0/emp/emp_1/my_stats"
Run Code Online (Sandbox Code Playgroud)

您需要与下划线连接的部件"emp""my_stats"部件'_'.而你尝试的替代品来看,"/v1.0/""/emp_1/"部分是静态的,所以你可以简单地做这一个替代品:

replacer := strings.NewReplacer("/v1.0/", "", "/emp_1/", "_")
Run Code Online (Sandbox Code Playgroud)

完整的例子:

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

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

output := replacer.Replace(input)
fmt.Println("Output:", output)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

Output: emp_my_stats
Run Code Online (Sandbox Code Playgroud)

笔记:

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

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

注释#2:

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