2016-10-04 5 views
-5

Я хочу разобрать строку xxxxx: yyyyy: zzz.aaa.bbb.cc: dd: ee: ff для структуры в Голанге, как я могу это сделать с помощью нескольких разделителей ':' и '.'.Как разделить несколько разделителей в Голанге?

Edit:

Я хочу, чтобы разбить строку "ххххх: ыыыыы: zzz.aaa.bbb.cc: дд" в ниже типа структуры

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

Просьба привести более полный пример. Это действительно то же самое, что и на любом другом языке, но не видя того, что вы хотите назначить, невозможно полностью ответить на ваш вопрос. Главное, расколоться на одно, а потом расколоть на другое. – evanmcdonnal

+0

К сожалению об этом Ok Я хочу, чтобы разбить строку «ххххй: ыыыыо: zzz.aaa.bbb.cc: дд» в ниже STRUCT типа образец Struct { Service струнного Тип строка домена строка Plan строка хоста строка область строка Другая строка } Так что служба = ххххй Type = ыыыыо Домен = ZZZZ Plan = ааа Host = БББ область = куб.см Другое = дд –

ответ

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

был просто набрав су сделать код для него. Не хотел отвечать на него в коде, который был и уродливым, и ценным уроком, чтобы учиться на собственном. –

+0

@NathanHyland да, это может быть слишком комфортно. К счастью, есть функция пониженного голосования, чтобы помочь сбалансировать вещи :) – evanmcdonnal

9

Вы можете использовать

strings.FieldsFunc(input, Split) 

Попробуйте на The Go Playground:

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", " -") 
} 
Смежные вопросы