亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 中的正則表達式命名組無法正確捕獲

Golang 中的正則表達式命名組無法正確捕獲

Go
收到一只叮咚 2021-10-25 20:31:41
我有以下字符串,它是來自我們網絡上的投影儀的發現數據包:AMXB<-SDKClass=VideoProjector><-UUID=ABCDEFG><-Make=DELL><-Model=S300w><-Revision=0.2.0>我正在嘗試編寫一些將其轉換為地圖的 Golang 代碼,以便我可以調用details["UUID"]并讓它返回ABCDEFG。我寫了一個看起來像這樣的正則表達式:(?:UUID=)(?P<UUID>(.*?))>|(?:Make=)(?P<Make>(.*?))>|(?:Model=)(?P<Model>(.*?))>|(?:SDKClass=)(?P<SDKClass>(.*?))>當我使用regex 101在線測試時,它似乎與所有內容都匹配得很好,除了編號組,但我可以很容易地忽略那些:匹配 1SDKClass [15-29] VideoProjector[15-29] 投影儀第 2 場UUID [37-49] B8AC6FDFE1E2[37-49] B8AC6FDFE1E2第 3 場制造 [57-61] 戴爾[57-61] 戴爾第 4 場型號 [70-75] S300w[70-75] S300w但是當我在 Golang 中嘗試時,我得到了不同的結果(注意:這些結果使用 go- spew整理以使其更易于閱讀):([][]string) (len=4 cap=10) { ([]string) (len=9 cap=9) {  (string) (len=24) "SDKClass=VideoProjector>",  (string) "",  (string) "",  (string) "",  (string) "",  (string) "",  (string) "",  (string) (len=14) "VideoProjector",  (string) (len=14) "VideoProjector" }, ([]string) (len=9 cap=9) {  (string) (len=18) "UUID=B8AC6FDFE1E2>",  (string) (len=12) "B8AC6FDFE1E2",  (string) (len=12) "B8AC6FDFE1E2",  (string) "",  (string) "",  (string) "",  (string) "",  (string) "",  (string) "" }, ([]string) (len=9 cap=9) {  (string) (len=10) "Make=DELL>",  (string) "",  (string) "",  (string) (len=4) "DELL",  (string) (len=4) "DELL",  (string) "",  (string) "",  (string) "",  (string) "" }, ([]string) (len=9 cap=9) {  (string) (len=12) "Model=S300w>",  (string) "",  (string) "",  (string) "",  (string) "",  (string) (len=5) "S300w",  (string) (len=5) "S300w",  (string) "",  (string) "" }}我的正則表達式有什么問題,我該如何解決?我已經嘗試了幾乎所有表達式組合(我現在幾乎是正則表達式大師:\)
查看完整描述

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]。


所以兩者都返回相同的結果。


查看完整回答
反對 回復 2021-10-25
?
手掌心

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()通過字符串=獲取屬性名稱和值。


我仍在尋找對我的正則表達式和/或代碼的改進,這樣我就可以了解如何在不需要額外拆分或過多代碼的情況下正確地做到這一點。


查看完整回答
反對 回復 2021-10-25
  • 2 回答
  • 0 關注
  • 271 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號