猿问

golang 正则表达式可以处理类似于 python 的“二进制”正则表达式吗?

转换一些python代码去,我需要匹配“二进制”正则表达式,不包含有效的utf8:


panic: regexp: Compile("^\xfd\xe2(..)(.)(..)\x00\x00\x00\x00\x00\x00.+$"): 

error parsing regexp: invalid UTF-8: `��(..)(.)(..).+$`

这可以用 golang 正则表达式库来完成吗?或者有什么类似的替代方法?


沧海一幻觉
浏览 253回答 2
2回答

HUWWW

Goregexp模块根本无法处理无效的 UTF-8。这在包概述中明确说明:“所有字符都是 UTF-8 编码的代码点。”。即使您\xfd\xe2在正则表达式中包含转义,它实际上也会匹配 UTF-8 字符串"\u00fd\u00e2"(或"\xc3\xbd\xc3\xa2"作为原始 UTF-8 字节)。package mainimport (    "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

芜湖不芜

为了编译这个正则表达式,你可以使用反引号 ` 而不是普通的引号。regexp.Compile(`^\xfd\xe2(..)(.)(..)\x00\x00\x00\x00\x00\x00.+$`)在这个讨论中,有人说您无法让 regexp 包匹配包含无效 UTF-8 序列的字符串。但似乎当转义是由 regexp 包而不是由编译器完成时,它可以工作(这就是为什么使用反引号但引号不起作用)。这些转义序列也可以在文档页面的相应表格中找到
随时随地看视频慕课网APP

相关分类

Go
我要回答