2016-02-26 3 views
5

私はA = Bのような文字列を持っています& C = D & E = F、どのようにgolangのマップに解析するのですか?ここでGolangに文字列を解析します

は、Javaの例ですが、私はこのsplit一部に

String text = "A=B&C=D&E=F"; 
Map<String, String> map = new LinkedHashMap<String, String>(); 
for(String keyValue : text.split(" *& *")) { 
    String[] pairs = keyValue.split(" *= *", 2); 
    map.put(pairs[0], pairs.length == 1 ? "" : pairs[1]); 
} 
+1

本当に欲しいのは['url.ParseQuery'](https://golang.org/pkg/net/url/#ParseQuery)だと思います。 – twotwotwo

答えて

5

を理解していないたぶん、あなたが本当に欲しいものHTTPクエリ文字列を解析することであり、url.ParseQueryはそれを行います。 (URLにはキーごとに複数の値があることがあるので、より正確には、url.Valuesにはすべてのキーに[]stringが格納されます)。分割するだけのHTMLエスケープ(%0Aなど)の解析などがあります。 the source of url.goで検索するとその実装が見つかります。

あなたはは本当にJavaコードがやったようにちょうど&=に分割したいん場合は、そこ概念とツールのすべてのために行く類似体があります

  • map[string]stringはのゴーのアナログでありますMap<String, String>
  • strings.Split&に分割することができます。 SplitNは、Javaで2つの引数バージョンのsplit()のように分割された個数を制限します。ワンピースしかないかもしれないので、pieces[1]にアクセスする前にlen(pieces)をチェックしてください。
  • for _, piece := range pieces分割した部分を繰り返します。
  • Javaコードは、スペースを整えるために正規表現に依存しているようです。 GoのSplitはそれらを使用しませんが、strings.TrimSpaceはあなたの望むもの(具体的には、あらゆる種類のUnicode空白を両側から除去します)を行います。

私はあなたに実際の実装を残していますが、おそらくこれらのポインタはあなたを起動させることができます。

5
import ("strings") 

var m map[string]string 
var ss []string 

s := "A=B&C=D&E=F" 
ss = strings.Split(s, "&") 
m = make(map[string]string) 
for _, pair := range ss { 
    z := strings.Split(pair, "=") 
    m[z[0]] = z[1] 
} 

これは、あなたが望むことを行います。

+0

元のJavaとのいくつかの相違点:1)アイテムに '='がないときにインデックスが範囲外でクラッシュする、2)区切り文字の周囲にスペースを入れない、3) '='の後ろにあるもの値の部分が削除されます。同じではなく、似たようなことをしてみてください。ちょうどすべてのクマが注目しています(特にクラッシュ)。 – twotwotwo