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