我是Go语言的新手,我正在寻找一种方法来将可变长度的字符串拆分成一个映射,其中键/值对(所有字符串)用逗号分隔,只有字符串的某些变体在给定键/值对中可以有多个逗号和/或冒号.例如:

String1 variation个 关键字1=值1,关键字2=值2,关键字3=值3,值4,值5,关键字4=值6... String2 variation 关键字1=值1,关键字2=值2,关键字3=值3,值4,值5:值6,值7,值8,关键字4=值9...

其中".."反映将存在键/值对的变量#这一事实.我想以这样的 map 结束:

map[string]string{
     
            keyw或d1: "value1",
            keyw或d2: "value2",
            keyw或d3: "value3,value4,value5",
            keyw或d4: "valu6",
    }

map[string]string{
     
            keyw或d1: "value1",
            keyw或d2: "value2",
            keyw或d3: "value3,value4,value5:value6,value7,value8",
            keyw或d4: "valu6",
    }

Unf或tunately the f或mat of lines I will be reading from the file is fairly convoluted and I have limited options f或 changing the incoming data f或mat. I have been spinning my wheels at this f或 a while and unf或tunately I'm no wizard with regex's, so any assistance would be greatly appreciated.

推荐答案

匹配(全局),而不是拆分,那么你就不需要环顾四周:(.*?)=([^=]*)(?:,|$).在围棋中:

package kvparse

import (
    "regexp"
    "testing"
    "reflect"
)

var kvPairRe = regexp.MustCompile(`(.*?)=([^=]*)(?:,|$)`)
func ParseKV(kvStr string) map[string]string {
    res := map[string]string{}
    for _, kv := range kvPairRe.FindAllStringSubmatch(kvStr, -1) {
        res[kv[1]] = kv[2]
    }
    return res
}

func TestParseKV(t *testing.T) {
    test := func(kvStr string, expectedMap map[string]string) {
        gotMap := ParseKV(kvStr)
        if !reflect.DeepEqual(expectedMap, gotMap) {
            t.Errorf("Abs(%s) = %v; want %v", kvStr, gotMap, expectedMap)
        }
    }
    test("keyword1=value1,keyword2=value2,keyword3=value3,value4,value5,keyword4=value6",
        map[string]string{ "keyword1": "value1", "keyword2": "value2", "keyword3": "value3,value4,value5", "keyword4": "value6" })
    test("keyword1=value1,keyword2=value2,keyword3=value3,value4,value5:value6,value7,value8,keyword4=value9",
        map[string]string{ "keyword1": "value1", "keyword2": "value2", "keyword3": "value3,value4,value5:value6,value7,value8", "keyword4": "value9" })
}

Go相关问答推荐

带有Go map[字符串]字符串的持久磁盘

运行add. inf,这样我们就可以在app.conf中使用. inf参数了?

链自定义GRPC客户端拦截器/DialOptions

为什么Slices包中的函数定义Slice参数的类型参数?

如何防止程序B存档/删除围棋中程序A当前打开的文件?

为什么没有正确生成这些元组?

Makefilego version和read命令

从 ApiGateway 中的 lambda Go 返回 Json

命令行参数在 Golang 程序中不正确地接受为参数

杜松子wine 和中间件

Golang crypto/rand 线程安全吗?

判断一个区域内的纬度/经度点

Golang 通过接口反映/迭代{}

通过环境变量配置 OTLP 导出器

Protobuf.Any - 从 json.RawMessage 解组

数据流中的无根单元错误,从 Golang 中的 PubSub 到 Bigquery

Dockerfile 问题 - 为什么找不到二进制 dlv - 没有这样的文件或目录

使用 delve 在容器中调试 Golang:container_linux.go:380:启动容器进程导致:exec:/dlv:stat /dlv:没有这样的文件或目录

gob 解码器仅返回数组中的第一个元素

处理程序中的无限循环