匹配序列化字符串[重复]

问题描述 投票:-4回答:2

这个问题在这里已有答案:

我从一个函数(在redis位图上运行"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"命令并给我序列化字符串)接收此字符串GET

但由于转义序列,我无法匹配这种模式。有人可以告诉我与这种字符串匹配的正则表达式序列吗?

regex go
2个回答
0
投票

首先,我试图找出如何以直接的二进制形式从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"))
}

Playground link


0
投票

An introduction to Redis data types and abstractions

位图

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


正则表达式不是最佳解决方案。编写一个简单的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)
}

游乐场:https://play.golang.org/p/rbE9iG3tOTx

输出:

0100000000000000000000804a13805351804ce0804092804c3f8048e0
0100000000000000000000804a13805351804ce0804092804c3f8048e0
© www.soinside.com 2019 - 2024. All rights reserved.