2017-06-02 34 views
-1

我有以下去字符串:golang使用提取唯一密钥,从密钥=值对字符串值正则表达式

dbConnStr := "user=someone password=something host=superduperhost sslmode=something" 

但第k = V对代码可以是任意的顺序,例如:

dbConnStr := "host=superduperhost user=someone password=something" 

注意关键顺序的不同以及str中缺少的“sslmode”键。

此外,有可能代替空格,单个k,v对可能被换行符隔开。

现在我想使用regexp从给定字符串中提取唯一键和它们的相应值。如果有帮助,我可以列出所有可能的密钥列表(用户名,密码,主机,sslmode),但我最好喜欢一个正则表达式解决方案,可以与任何键和值列表一起使用。

如何做到这一点?我明白,它可能与regexp.FindStringSubmatch但不能围绕编写正则表达式包装我的头。

+0

事情可能变得复杂,如果值中包含'='。查看'lib/pq'中['parseOpts'](https://github.com/lib/pq/blob/master/conn.go#L420)函数的实现。它将键/值对分成一个'map [string] string'。 – putu

回答

1

得到的回答这个从golang坚果组

conn := `user=someone password=something host=superduperhost 
sslmode=something` 
    data := rex.FindAllStringSubmatch(conn, -1) 

    res := make(map[string]string) 
    for _, kv := range data { 
     k := kv[1] 
     v := kv[2] 
     res[k] = v 
    } 
    fmt.Println(res) 

Golang游乐场网址:https://play.golang.org/p/xSEX1CAcQE

+0

我有一个类似的情况,字符串的第一部分保持静态,我想检查该部分是否存在。我怎样才能做到这一点?示例字符串:'ACCESS:user = someone password = something host = superduperhost sslmode = something' –

+0

简单的strings.HasPrefix将不够用?如果你希望这个检查也是正则表达式的一部分,那么我现在就不熟练地回答它。你可能会问,这可能是一个新问题。 –

0

我个人看是这样的:。

((用户|密码|主机)=([\ w] +)

给你钥匙在\ 1和值\ 2

例操场:

https://play.golang.org/p/6-Ler6-MrY

+0

注意操场上\ 2的角色类需要扩展以允许所有你想要的角色。我一直在这里故意缩小, –