2 回答
TA贡献1851条经验 获得超5个赞
据我所知,它与您编写的完全一样,并且在 regex101 和 Go 中都同样出色。您观察到的差异仅仅是因为结果呈现方式的不同。
让我们仔细看看 regex101 返回的结果。例如,这个:
MATCH 1
SDKClass [15-29] `VideoProjector`
8. [15-29] `VideoProjector`
它基本上说它找到了两个子匹配,其中一个被命名,另一个在索引 8 上。让我们看看 Go:
([]string) (len=9 cap=9) {
(string) (len=24) "SDKClass=VideoProjector>",
(string) "",
(string) "",
(string) "",
(string) "",
(string) "",
(string) "",
(string) (len=14) "VideoProjector",
(string) (len=14) "VideoProjector"
},
它说它找到了两个子匹配,分别是第 7 组和第 8 组。为了获得第 7 组的名称,您应该调用r.SubexpNames(),它将返回SDKClassfor r.SubexpNames()[7]。
所以两者都返回相同的结果。
TA贡献1942条经验 获得超3个赞
所以在 AlexAtNet 的帮助下,我得到了一个答案——足以让我继续前进。这是我的最终代码:
r, _ := regexp.Compile("<-([^=]+)=([^>]+)>")
match := r.FindAllString(string(msg), -1)
result := make(map[string]string)
for _, p := range match {
split := strings.Split(p, "=")
result[split[0]] = split[1]
}
结果如下:
([]string) (len=4 cap=10) {
(string) (len=23) "SDKClass=VideoProjector",
(string) (len=17) "UUID=B8AC6FDFE1E2",
(string) (len=9) "Make=DELL",
(string) (len=11) "Model=S300w"
(string) (len=14) "Revision=0.2.0"
}
但我可以简单地Split()通过字符串=获取属性名称和值。
我仍在寻找对我的正则表达式和/或代码的改进,这样我就可以了解如何在不需要额外拆分或过多代码的情况下正确地做到这一点。
- 2 回答
- 0 关注
- 234 浏览
添加回答
举报