猿问

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

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


试试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等,但真的很想在一次通过/或一次声明中完成。


任何建议如何干净地做到这一点?我的目标是高效(这将经常进行,尽管这些字符串很短,但非常重要)并且不使用多个Replacers。


慕哥6287543
浏览 157回答 2
2回答

慕运维8079593

您还没有指定任何其他可能的输入,但它看起来是这样的: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 上同时运行。使用Replacer来自多个 goroutine 的a 是安全的,引用自以下文档Replacer:多个 goroutine 并发使用是安全的。注释#2:如果输入中的"/v1.0/"和"/emp_1/"部分不是静态的,那么您无法真正用Replacer. 在这种情况下,您可以使用 regexp 或作为更有效的解决方案,将字符串拆分为'/'并将相关部分与'_'.

尚方宝剑之说

strings.Split 可能会完成你想要的:package mainimport (    "fmt"    "strings")//Expecting output to be emp_my_statsfunc 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_statsemp_1my_statsemp_my_statsemp_my_stats您可以在此处在go Playground上看到它的运行情况。
随时随地看视频慕课网APP

相关分类

Go
我要回答