在PHP中,使用Go函数可以将一串用逗号分隔的键/值对进行分割。这个函数非常有用,特别是在给定的键/值对中可能嵌入逗号的情况下。使用Go函数可以轻松地将键/值对分割成独立的部分,以便进一步处理和使用。无论是处理表单数据,还是解析CSV文件,Go函数都可以帮助我们高效地完成任务。在本文中,我们将详细介绍如何使用Go函数分割键/值对,并提供一些实用的示例供参考。让我们开始吧!
问题内容
我对 Go 语言相当陌生,正在寻找一种方法将可变长度字符串拆分为一个映射,其中键/值对(所有字符串)以逗号分隔,只有字符串的某些变体可能有多个逗号和/或给定键/值对中的冒号。例如:
字符串1变体
关键字1=值1,关键字2=值2,关键字3=值3,值4,值5,关键字4=值6 ...
字符串2变体
关键字1=值1,关键字2=值2,关键字3=值3,值4,值5:值6,值7,值8,关键字4=值9 ...
其中“...”反映了这样一个事实:将有一个变量#键/值对。我希望最终得到一张这样的地图:
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",
}
登录后复制
不幸的是,我将从文件中读取的行格式相当复杂,并且我用于更改传入数据格式的选项有限。我已经在这方面投入了一段时间,不幸的是我不是正则表达式的向导,所以任何帮助将不胜感激。
解决方法
匹配(全局),而不是拆分,那么您不需要环视:(.*? )=([^=]*)(?:,|$)
。在 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" })
}
登录后复制
以上就是Go:分割一串用逗号分隔的键/值对,给定的键/值对中可能嵌入逗号的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!