如何在Golang中用多个分隔符拆分字符串?

时间:2016-10-04 22:16:50

标签: go

我想解析一个字符串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 

5 个答案:

答案 0 :(得分:22)

您可以使用

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}

答案 1 :(得分:2)

您可以使用正则表达式来分割字符串

import "regexp"

func splitWord(word string) []string {
    array := regexp.MustCompile("[\\:\\,\\.\\s]+").Split(word, -1)
    return array
}

答案 2 :(得分:1)

这是一个通用函数,它将字符串作为一组符文来分割。

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", " -")
}

答案 3 :(得分:0)

好的。这不是一个非常优雅的解决方案,但它至少应该让你开始并为你已经给出的具体例子工作。实际上,您可能希望添加一些错误处理或稍微概括逻辑以使用更广泛的输入。

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

答案 4 :(得分:0)

您可以使用此功能,该功能可以将字符串分成多个符文:

import "fmt"
import "strings"

func SplitAny(s string, seps string) []string {
    splitter := func(r rune) bool {
        return strings.ContainsRune(seps, r)
    }
    return strings.FieldsFunc(s, splitter)
}

func main() {
    words := SplitAny("xxxxx:yyyyy:zzz.aaa.bbb.cc:dd:ee:ff", ".:")
    fmt.Println(strings.Join(words, " "))
}

输出:

xxxxx yyyyy zzz aaa bbb cc dd ee ff

或者甚至只用一行代码:

words := strings.FieldsFunc(s, func(r rune) bool { return strings.ContainsRune(" .:", r) })