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

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

golang 正則表達式可以處理類似于 python 的“二進制”正則表達式嗎?

golang 正則表達式可以處理類似于 python 的“二進制”正則表達式嗎?

Go
滄海一幻覺 2022-06-13 15:53:04
轉換一些python代碼去,我需要匹配“二進制”正則表達式,不包含有效的utf8:panic: regexp: Compile("^\xfd\xe2(..)(.)(..)\x00\x00\x00\x00\x00\x00.+$"): error parsing regexp: invalid UTF-8: `??(..)(.)(..).+$`這可以用 golang 正則表達式庫來完成嗎?或者有什么類似的替代方法?
查看完整描述

2 回答

?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

Goregexp模塊根本無法處理無效的 UTF-8。這在包概述中明確說明:“所有字符都是 UTF-8 編碼的代碼點?!?。


即使您\xfd\xe2在正則表達式中包含轉義,它實際上也會匹配 UTF-8 字符串"\u00fd\u00e2"(或"\xc3\xbd\xc3\xa2"作為原始 UTF-8 字節)。


package main


import (

    "fmt"

    "regexp"

)


func main() {

    r := regexp.MustCompile(`\xfd\xe2`)


    s1 := "\xfd\xe2"

    s2 := "\u00fd\u00e2"


    if s2 != "\xc3\xbd\xc3\xa2" {

        panic("")

    }


    fmt.Println(r.MatchString(s1)) // false

    fmt.Println(r.MatchString(s2)) // true

}

(去游樂場鏈接:https ://go.dev/play/p/HV62GExQ_5j )


如果您查看regexp源代碼,您會發現即使您調用Match(b []byte),最后它仍然適用于從 UTF-8 字節字符串解碼的符文。見regexp/inputBytes.step regexp.go


查看完整回答
1 反對 回復 2022-06-13
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

為了編譯這個正則表達式,你可以使用反引號 ` 而不是普通的引號。

regexp.Compile(`^\xfd\xe2(..)(.)(..)\x00\x00\x00\x00\x00\x00.+$`)

這個討論中,有人說

您無法讓 regexp 包匹配包含無效 UTF-8 序列的字符串。

但似乎當轉義是由 regexp 包而不是由編譯器完成時,它可以工作(這就是為什么使用反引號但引號不起作用)。這些轉義序列也可以在文檔頁面的相應表格中找到


查看完整回答
反對 回復 2022-06-13
  • 2 回答
  • 0 關注
  • 296 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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