2017-04-24 10 views
0

私は文字列分割で戦っています。文字列をワイルドカードで分割したいのですが、このスライスにもこのワイルドカードを含める必要があります。例えばどのように効率的な分割文字列を部分にすることができます

:ここ/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を使って最良の結果を得られると思っていますが、パーサの作成に興味があります。彼らは楽しいし、ロブパイクは楽しいもカスタムレキシカルスキャナを書く方法を説明する比較的有名な話をしています。 –

答えて

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 
} 

私はパスが有効だったかどう、他のパスのさまざまな部分を抽出し、それらを返すためにチェックするために、2つの正規表現を作成することで、1をこれを作りました。パスが有効でない場合、空のリストが返されます。これのリターンは次のようになります。あなたはすでに復帰が、最後の文字列内のすべての文字列がディレクトリであることを知っていると最後の文字列がファイルであるため、これは「/」文字が含まれていません

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

名。妥当性チェックのためにこれを仮定することができます。

関連する問題