输入字符串:“/// hello // stackover.flow”
预期输出“/hello/stackover.flow”
答案 0 :(得分:6)
您可以使用path.Clean
。
func Clean(path string) string
Clean通过纯粹的词法处理返回等同于path的最短路径名。它迭代地应用以下规则,直到不能进行进一步处理:
- 用一个斜杠替换多个斜杠。
- 消除每一个。路径名元素(当前目录)。
- 消除每个内部..路径名称元素(父目录) 以及它之前的非..元素。
- 消除..开始根路径的元素: 也就是说,在路径的开头用“/”替换“/ ..”。 只有当它是根“/".
时,返回的路径才以斜线结尾 醇>如果此过程的结果为空字符串,则Clean返回字符串“。”。
这是一个简单的基准测试,将其与正则表达式解决方案进行比较:
package main
import (
"path"
"regexp"
"testing"
)
var p = "///hello//stackover.flow"
func BenchmarkPathRegexp(b *testing.B) {
re := regexp.MustCompile("/+")
for i := 0; i < b.N; i++ {
re.ReplaceAllLiteralString(p, "/")
}
}
func BenchmarkPathClean(b *testing.B) {
for i := 0; i < b.N; i++ {
path.Clean(p)
}
}
结果:
BenchmarkPathRegexp-4 2000000 794 ns/op
BenchmarkPathClean-4 10000000 145 ns/op
答案 1 :(得分:1)
只是一个选择。如果您需要替换其他一些多个字符,可以使用它。
re, _ := regexp.Compile("/+")
fmt.Println(re.ReplaceAllLiteralString("///hello//stackover.flow", "/"))