2016-12-27 119 views

回答

1

只是一种选择。如果您需要替换其他多个字符,则可以使用它。

re, _ := regexp.Compile("/+") 

fmt.Println(re.ReplaceAllLiteralString("///hello//stackover.flow", "/")) 
5

您可以使用path.Clean了点。

func Clean(path string) string 

清洁返回相当于最短路径名路径由单纯的词汇处理。它反复应用以下规则,直到不能进一步处理:

  1. 用单斜杠替换多个斜线。
  2. 消除每个。路径名称元素(当前目录)。
  3. 消除每个内部..路径名称元素(父目录) 以及它之前的非..元素。
  4. 消除..开始根路径的元素: 即在路径开头用“/”替换“/ ..”。 返回的路径只有以“/”为根时才以斜杠结尾。

如果此过程的结果是空字符串,则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 
+0

这应该是一个被接受的答案。 – Matt