为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信