Regex 匹配序列化字符串
我从一个函数(在redis位图上运行Regex 匹配序列化字符串,regex,go,Regex,Go,我从一个函数(在redis位图上运行GET命令并给我序列化的字符串)接收到这个字符串 但是由于逃逸序列,我很难匹配这种模式。有人能告诉我与这种字符串匹配的正则表达式序列吗?首先,我想了解如何从Redis中以直接的二进制形式获取相同的数据(如[]byte);剩下的就简单多了 但要以目前的形式处理这些东西, 我将首先规范化输入字符串,替换所有这些字符串 带等效字节的反斜杠转义十六进制编码字符 这将允许轻松搜索这些参数的精确值 可能使用反斜杠转义十六进制编码字符的字节 在模式中: 包干管 import
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'命令返回的普通字符串,例如,如果redisSET key value
和onget key
I getvalue
中存储了字符串对,我也会得到这种类型\x01\x00\x00。。。当我在位图键上运行GET
时的字符串值。因此,我想区分这两种方法,以了解调用了哪个数据结构GET
,或者密钥属于哪个数据结构@AdrianCross在r/golang
上提问的帖子。