我正在从一个函数中接收此字符串"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80J\x13\x80SQ\x80L\xe0\x80@\x92\x80L?\x80H\xe0"
(该函数在redis位图上运行GET
命令,并给我序列化的字符串)
但是由于转义序列,我无法匹配这种模式。能否请您告诉我将与这种字符串匹配的正则表达式序列?
答案 0 :(得分:0)
首先,我将尝试找出如何以直接的二进制形式(如[]byte
)从Redis获取相同的数据;剩下的话会更简单。
但是要以目前的形式处理这些东西, 我首先将输入字符串标准化-替换所有那些 反斜杠转义的十六进制编码字符及其等效字节。
这样可以轻松搜索这些的确切值 字节-可能使用反斜杠转义的十六进制编码字符 在模式中:
软件包主要
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"))
}
答案 1 :(得分:0)
An introduction to Redis data types and abstractions
位图
位图不是实际的数据类型,而是一组面向位的 在字符串类型上定义的操作。
正则表达式不是最佳解决方案。编写一个简单的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