为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕哥6287543 2021-11-29 15:48:22
我正在尝试从一个字符串中替换多个不同的字符,Replacer但在替换一个字符串时遇到了问题。输出有两个下划线而不是一个,如果我尝试使用 otherReplacer替换它,那么它不能完全替换它。试试Go Playground上的代码:package mainimport (    "fmt"    "strings"    )//Expecting output to be emp_my_statsfunc 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。
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超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 上同时运行。使用Replacer来自多个 goroutine 的a 是安全的,引用自以下文档Replacer:


多个 goroutine 并发使用是安全的。


注释#2:


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


查看完整回答
反对 回复 2021-11-29
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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上看到它的运行情况。


查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信