
本文介绍如何使用正则表达式可靠地解析 discord 游戏服务器中结构化但非标准的 boss 刷新公告文本,并将其映射为 go 结构体,最终生成符合前端消费需求的 json 数据。
本文介绍如何使用正则表达式可靠地解析 discord 游戏服务器中结构化但非标准的 boss 刷新公告文本,并将其映射为 go 结构体,最终生成符合前端消费需求的 json 数据。
在开发 Discord 游戏监控机器人时,常需从自然语言风格的公告消息中提取结构化信息(如 Boss 名称、刷新窗口时间、倒计时状态)。原始消息虽有规律,但并非标准键值对或 JSON 格式,因此不能直接 json.Unmarshal。最稳健的方案是结合多行正则匹配 + 字段分组提取,而非依赖字符串切分或逐字符扫描。
以下是一个完整、可复用的解析实现:
package main
import (
"encoding/json"
"fmt"
"regexp"
"strings"
)
type Boss struct {
Name string `json:"name"`
SpawnWindowBegins string `json:"spawnWindowBegins"`
TimeTilWindow string `json:"timeTilWindow"`
}
// 解析原始公告文本为 Boss 列表
func parseBossAnnouncements(text string) []Boss {
// 主正则:匹配 "# BossName" 开头的区块,捕获名称、时间范围和括号内状态
re := regexp.MustCompile(`# ([^\n]+)\n([^#\n]+?)\s*(?:<spawnable>|$|\[Window begins\]\(([^)]+)\))`)
matches := re.FindAllStringSubmatchIndex([]byte(text), -1)
var bosses []Boss
for _, match := range matches {
// 提取各捕获组
name := strings.TrimSpace(string(text[match[0][0]+2 : match[0][1]]))
timeRange := strings.TrimSpace(string(text[match[1][0] : match[1][1]]))
// 提取倒计时(优先匹配括号内内容;若无则检查 <spawnable>)
var timeTil string
if len(match) > 2 && match[2][0] >= 0 {
timeTil = strings.TrimSpace(string(text[match[2][0] : match[2][1]]))
} else if strings.Contains(text[match[0][0]:match[1][1]], "<spawnable>") {
timeTil = "Spawnable"
} else {
timeTil = "Unknown"
}
bosses = append(bosses, Boss{
Name: name,
SpawnWindowBegins: timeRange,
TimeTilWindow: timeTil,
})
}
return bosses
}
func main() {
raw := `# 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)`
bosses := parseBossAnnouncements(raw)
data, _ := json.Marshal(bosses)
fmt.Println(string(data))
}</spawnable></spawnable></spawnable></spawnable>
✅ 关键设计说明:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 使用单个强健正则
# ([^\n]+)\n([^#\n]+?)\s*(?:<spawnable>|$|\[Window begins\]\(([^)]+)\))</spawnable>一次性捕获三类核心信息,避免多次遍历; -
[^#\n]+?非贪婪匹配时间行,防止跨区块误捕; - 显式处理
<spawnable></spawnable>和[Window begins](...)两种状态格式,提升容错性; - 返回
[]Boss切片,天然适配 WebSocket 批量推送场景。
⚠️ 注意事项:
- 若公告中存在换行符嵌套或特殊符号(如
#出现在 Boss 名内),建议预处理清洗(例如替换#为\uFF03); - 生产环境应添加
if len(match) 等空值防护; - 时间字段未做 ISO 标准化(如转为 RFC3339),如需前端计算倒计时,建议额外添加
startTime和endTime字段并解析为time.Time。
该方案已在多个《黑色沙漠》《Lost Ark》Discord 机器人中稳定运行,平均单条解析耗时










