Regex 匹配序列化字符串

Regex 匹配序列化字符串,regex,go,Regex,Go,我从一个函数(在redis位图上运行GET命令并给我序列化的字符串)接收到这个字符串 但是由于逃逸序列,我很难匹配这种模式。有人能告诉我与这种字符串匹配的正则表达式序列吗?首先,我想了解如何从Redis中以直接的二进制形式获取相同的数据(如[]byte);剩下的就简单多了 但要以目前的形式处理这些东西, 我将首先规范化输入字符串,替换所有这些字符串 带等效字节的反斜杠转义十六进制编码字符 这将允许轻松搜索这些参数的精确值 可能使用反斜杠转义十六进制编码字符的字节 在模式中: 包干管 import

我从一个函数(在redis位图上运行
GET
命令并给我序列化的字符串)接收到这个字符串


但是由于逃逸序列,我很难匹配这种模式。有人能告诉我与这种字符串匹配的正则表达式序列吗?

首先,我想了解如何从Redis中以直接的二进制形式获取相同的数据(如
[]byte
);剩下的就简单多了

但要以目前的形式处理这些东西, 我将首先规范化输入字符串,替换所有这些字符串 带等效字节的反斜杠转义十六进制编码字符

这将允许轻松搜索这些参数的精确值 可能使用反斜杠转义十六进制编码字符的字节 在模式中:

包干管

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    s := "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"
    s, err := strconv.Unquote(`"` + s + `"`)
    if err != nil {
        panic(err)
    }
    fmt.Println(strings.Index(s, "\x80SQ\x80L"))
}

位图

位图不是实际的数据类型,而是一组面向位的数据类型 在字符串类型上定义的操作


正则表达式不是最好的解决方案。编写一个简单的Go函数来进行转换。比如说,

package main

import (
    "fmt"
    "strconv"
)

func redisBits(s string) (string, error) {
    s, err := strconv.Unquote(`"` + s + `"`)
    if err != nil {
        return "", err
    }
    return s, nil
}

func main() {
    s := "\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"
    fmt.Printf("%x\n", s)
    b, err := redisBits(s)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%x\n", b)
}
游乐场:

输出:

0100000000000000000000804a13805351804ce0804092804c3f8048e0
0100000000000000000000804a13805351804ce0804092804c3f8048e0

这不是同一个问题吗?你到底想做什么?随着模式的发展,
*
将匹配您的字符串,但是我猜你在寻找比这更具体的东西。应该准确地捕获哪一部分?因此我想区分由'get'命令返回的普通字符串,例如,如果redis
SET key value
和on
get key
I get
value
中存储了字符串对,我也会得到这种类型\x01\x00\x00。。。当我在位图键上运行
GET
时的字符串值。因此,我想区分这两种方法,以了解调用了哪个数据结构
GET
,或者密钥属于哪个数据结构@AdrianCross在
r/golang
上提问的帖子。