2017-04-24 67 views
0

我正在與字符串拆分戰鬥。我想通過通配符 s將字符串拆分成一個分片,但這個分片也應該包含這個通配符。轉到如何有效地拆分字符串到部分

例如:/applications/{name}/tokens/{name}應分成[/applications/ {name} /tokens/ {name}]

這裏是一個示例代碼我寫的,但它不能正常工作,並且我不感覺很好,要麼。

https://play.golang.org/p/VMOsJeaI4l

有要被測試的一些示例的路由。方法splitPath將路徑拆分爲部分並顯示:前後。

+0

是否有你不想使用'strings.Split'的原因? https://golang.org/pkg/strings/#Split –

+0

因爲我希望'separator'包含在內,在我的情況下,分隔符可以是不同的,例如'{name}/{surname}'。你不知道'{}'和它們中有多少字符串之間有什麼字符串 – Vardius

+1

我仍然認爲你會從使用strings.Split中得到最好的結果,但是你可能有興趣編寫一個解析器;他們很有趣,Rob Pike有一個比較有名的演講來解釋如何編寫定製的詞法掃描器,這也很有趣。 –

回答

0

這裏是一個解決方案:

var validPathRe = regexp.MustCompile("^(/{[[:alpha:]]+}|/[-_.[:alnum:]]+)+$") 
var splitPathRe = regexp.MustCompile("({[[:alpha:]]+}|[-_.[:alnum:]]+)") 

func splitPath(path string) parts{ 
    var retPaths parts 

    if !validPathRe.MatchString(path) { 
     return retPaths 
    } 

    retPaths = splitPathRe.FindAllString(path, -1) 

    return retPaths 
} 

我通過創建兩個正則表達式,一個檢查,如果路徑是有效還是無效,其他提取路徑的各個部分,並返回他們提出這一點。如果路徑無效,它將返回一個空列表。這樣做的回報將是這樣的:

splitPath("/path/{to}/your/file.txt") 
["path" "{to}" "your" "file.txt"] 

這不包括「/」字符,因爲你已經知道,在回報,但最後一個字符串的所有字符串是一個目錄,最後一個字符串是文件名稱。由於有效性檢查,你可以假設這一點。