Go:拆分一个由逗号分隔的键/值对组成的字符串,在给定的键/值对中可能嵌入逗号

li9yvcax  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(89)

我对Go语言相当陌生,正在寻找一种方法来将可变长度的字符串拆分成一个Map,其中键/值对(所有字符串)由逗号分隔,只有字符串的某些变体可能在给定的键/值对中有多个逗号和/或冒号。举例来说:

String1 variationkeyword1=value1,keyword2=value2,keyword3=value3,value4,value5,keyword4=value6.String2 variationkeyword1=value1,keyword2=value2,keyword3=value3,value4,value5:value6,value7,value8,keyword4=value9 ...

其中“...”反映了将存在键/值对的变量#的事实。最后,我想用一张Map来结束:

map[string]string{
     
            keyword1: "value1",
            keyword2: "value2",
            keyword3: "value3,value4,value5",
            keyword4: "valu6",
    }

map[string]string{
     
            keyword1: "value1",
            keyword2: "value2",
            keyword3: "value3,value4,value5:value6,value7,value8",
            keyword4: "valu6",
    }

不幸的是,我将从文件中阅读的行的格式相当复杂,并且我在更改传入数据格式方面的选项有限。我已经在这方面做了一段时间了,不幸的是我不是正则表达式的向导,所以任何帮助都将非常感谢。

cngwdvgl

cngwdvgl1#

匹配(全局),而不是分割,那么你就不需要查找:(.*?)=([^=]*)(?:,|$) .在Go中:

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

相关问题