2 回答

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

TA貢獻1796條經驗 獲得超7個贊
為了編譯這個正則表達式,你可以使用反引號 ` 而不是普通的引號。
regexp.Compile(`^\xfd\xe2(..)(.)(..)\x00\x00\x00\x00\x00\x00.+$`)
在這個討論中,有人說
您無法讓 regexp 包匹配包含無效 UTF-8 序列的字符串。
但似乎當轉義是由 regexp 包而不是由編譯器完成時,它可以工作(這就是為什么使用反引號但引號不起作用)。這些轉義序列也可以在文檔頁面的相應表格中找到
- 2 回答
- 0 關注
- 296 瀏覽
添加回答
舉報