2016-10-04 15 views
-5

私はGolangの構造体に文字列xxxxx:yyyyy:zzz.aaa.bbb.cc:dd:ee:ffを解析したいのですが、複数の区切り文字「:」と「。Golangで複数の区切り文字を分割する方法は?

編集:私は、文字列を分割したい

"XXXXX:YYYYY:zzz.aaa.bbb.cc:DD" という

type Target struct { 
    Service string 
    Type string 
    Domain string 
    Plan string 
    Host string 
    Region string 
    Other string 
} 

だから、構造体型以下に

Service = xxxxx 
Type = yyyyy 
Domain = zzzz 
Plan = aaa 
Host = bbb 
Region = cc 
Other = dd 
+2

より完全な例を挙げてください。これは他の言語とまったく同じですが、割り当てたいものを見ずに質問に完全に答えることはできません。基本的なことは、1つに分割し、次に分割します。構造体 タイプのサンプル構造体{ サービス列 タイプ列 ドメイン文字列 計画列 ホスト以下にその [OK]を、私は、文字列を分割したい「:YYYYY:zzz.aaa.bbb.cc DD XXXXX」については申し訳ありません – evanmcdonnal

+0

文字列 地域列 他の文字列 } サービス= XXXXX タイプ= YYYYY ドメインリージョン= CC その他= DD –

答えて

1

これは非常にエレガントな解決策ではありませんが、あなたが与えた具体的な例のために少なくともあなたを始めて、働かせるべきです。実際には、多少のエラー処理を追加したり、ロジックを一般化してより広範な入力セットで作業したりすることをお勧めします。

type Target struct { 
    Service string 
    Type string 
    Domain string 
    Plan string 
    Host string 
    Region string 
    Other string 
} 

func main() { 
    input := `xxxxx:yyyyy:zzz.aaa.bbb.cc:dd:ee:ff` 
    t := Target{} 
    tokens := strings.Split(input, ":") 
    t.Service = tokens[0] 
    t.Type = tokens[1] 
    subtokens := strings.Split(tokens[2], ".") 
    t.Domain = subtokens[0] 
    t.Plan = subtokens[1] 
    t.Host = subtokens[2] 
    t.Region = subtokens[3] 
    t.Other = tokens[3] 
    fmt.Printf("%v", t) 
} 

ここでの動作例は、 https://play.golang.org/p/57ZyOfdbvo

+0

だけでsuコマンドを入力した= ZZZZ 計画= AAA ホスト= BBB だから彼のためにこれを行うコード。自分のことを学ぶためには、醜いと貴重な教訓の両方でコードに答えることを望んでいませんでした。 –

+0

@ NathanHylandええ、それはちょっと余裕があるかもしれません。ありがたいことにバランスを取るのに役立つダウン投票機能があります:) – evanmcdonnal

9

あなたはThe Go Playground上でそれを試してみてください

strings.FieldsFunc(input, Split) 

を使用することがあります。

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    input := `xxxxx:yyyyy:zzz.aaa.bbb.cc:dd:ee:ff` 
    a := strings.FieldsFunc(input, Split) 
    t := Target{a[0], a[1], a[2], a[3], a[4], a[5], a[6]} 
    fmt.Println(t) // {xxxxx yyyyy zzz aaa bbb cc dd} 
} 
func Split(r rune) bool { 
    return r == ':' || r == '.' 
} 

type Target struct { 
    Service string 
    Type string 
    Domain string 
    Plan string 
    Host string 
    Region string 
    Other string 
} 

出力:

{xxxxx yyyyy zzz aaa bbb cc dd} 
0

ここでは、セットとして文字列を取る一般的な機能であります割れ目をつける

func Splitter(s string, splits string) []string { 
    m := make(map[rune]int) 
    for _, r := range splits { 
     m[r] = 1 
    } 

    splitter := func(r rune) bool { 
     return m[r] == 1 
    } 

    return strings.FieldsFunc(s, splitter) 
} 

func TestSplit() { 
    words := Splitter("orange apple-banana", " -") 
} 
関連する問題