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 关注
- 252 浏览
添加回答
举报