2016-12-27 71 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

相關問題