匹配序列化的字符串

时间:2018-08-31 15:10:54

标签: regex go

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

但是由于转义序列,我无法匹配这种模式。能否请您告诉我将与这种字符串匹配的正则表达式序列?

2 个答案:

答案 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"))
}

Playground link

答案 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