我正在创建一个在非常受欢迎的视频游戏服务器中收听频道的Discord机器人,他们在那里有一个机器人,由大多数命令手动命令,以宣布某些事情,如老板产生。以下是文本示例:
# Red Nose
Mon, 06:45 EST - Mon, 15:15 EST <Spawnable>
# Kutum
Mon, 09:25 EST - Mon, 17:55 EST [Window begins](in 2 hours)
# Karanda
Mon, 09:50 EST - Mon, 14:20 EST [Window begins](in 3 hours)
# Dastard Bheg
Mon, 11:15 EST - Mon, 19:45 EST [Window begins](in 4 hours)
# Nouver
Mon, 12:30 EST - Mon, 18:00 EST [Window begins](in 6 hours)
# Kzarka
Mon, 14:10 EST - Mon, 18:40 EST [Window begins](in 7 hours)
# Dim Tree Spirit
Mon, 15:50 EST - Tue, 00:20 EST [Window begins](in 9 hours)
# Giant Mudster
Mon, 16:55 EST - Tue, 01:25 EST [Window begins](in 10 hours)
我的机器人已连接到服务器并正常阅读聊天消息,但我想知道解析这些数据的最简洁方法是什么。我将把数据格式化为:
type Boss struct {
Name string `json:"name"`
SpawnWindowBegins string `json:"spawnWindowBegins"`
TimeTilWindow string `json:"timeTilWindow"`
}
所以例如我需要解析
Name = Red Nose
SpawnWindowBegins = Mon, 06:45 EST - Mon, 15:15 EST
TimeTilWindow = Spawnable || in X hours
这样我就可以通过websocket将数据发送到我的网站并处理我可以做的就好了我只是不确定将文本解析成结构的最佳方法。感谢。
答案 0 :(得分:2)
一般情况下,我建议使用正则表达式来进行此类解析。创建一个正则表达式来识别您的密钥,然后根据需要修补您的数据结构。
nameValueParseRegex := regexp.MustCompile(`^(.*) = (.*)$?\z`)
lines := []string{
`Name = Red Nose`,
`SpawnWindowBegins = Mon, 06:45 EST - Mon, 15:15 EST`,
`Wrong format line`,
`TimeTilWindow = Spawnable || in X hours`,
}
boss := Boss{}
for _, value := range lines {
lineResult := nameValueParseRegex.FindAllStringSubmatch(value, -1)
if lineResult != nil && len(lineResult) > 0 {
if lineResult[0][1] == "Name" {
boss.Name = lineResult[0][2]
}
if lineResult[0][1] == "SpawnWindowBegins" {
boss.SpawnWindowBegins = lineResult[0][2]
}
if lineResult[0][1] == "TimeTilWindow" {
boss.TimeTilWindow = lineResult[0][2]
}
}
}
s, _ := json.Marshal(boss)
fmt.Printf("%s", s)
输出:
{"name":"Red Nose","spawnWindowBegins":"Mon, 06:45 EST - Mon, 15:15 EST","timeTilWindow":"Spawnable || in X hours"}