如何将字符串中的多个斜杠(///)替换为Go lang中的一个斜杠(/)?

时间:2016-12-27 08:35:55

标签: go

输入字符串:“/// hello // stackover.flow”

预期输出“/hello/stackover.flow”

2 个答案:

答案 0 :(得分:6)

您可以使用path.Clean

func Clean(path string) string
     

Clean通过纯粹的词法处理返回等同于path的最短路径名。它迭代地应用以下规则,直到不能进行进一步处理:

     
      
  1. 用一个斜杠替换多个斜杠。
  2.   
  3. 消除每一个。路径名元素(当前目录)。
  4.   
  5. 消除每个内部..路径名称元素(父目录)   以及它之前的非..元素。
  6.   
  7. 消除..开始根路径的元素:   也就是说,在路径的开头用“/”替换“/ ..”。   只有当它是根“/".
  8. 时,返回的路径才以斜线结尾         

    如果此过程的结果为空字符串,则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", "/"))