我是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 Net/http路由

CGO如何转换为文件*类型

如何修复Go中调用GetRawInputDeviceInfA Windows API函数时的错误?

仅呈现一个模板的GIN Web应用程序

未对GoFr中的所有请求进行跟踪

Golang中的泛型 struct /接口列表

在整个SQL事务中将使用上下文作为默认设置吗?

Go:为什么我不能比较 net.Addr

Go-如何在递归函数中关闭通道

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

使用goroutines在Golang中验证 struct

使用Go和Operator SDK通过API调用设置Kubernetes Pods的安装步骤

在密钥不存在时处理 PATCH 部分更新

从Go中的随机日期开始以天为单位获取时间

级联调用泛型函数时的泛型类型推断

如何使用 Status 字段创建 Kubernetes 对象?

使用 bolthold 3 条件进行 boltDB 查询

Terraform 自定义提供程序 - 数据源架构

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

gopls 为 github.com/Shopify/sarama 返回错误gopls: no packages returned: packages.Load error