【问题标题】:golang extract unique key, value from a key=value pair string using regexgolang使用正则表达式从键=值对字符串中提取唯一键和值
【发布时间】:2017-06-07 22:06:59
【问题描述】:

我有以下 go 字符串:

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

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

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

请注意键顺序的差异以及 str 中缺少的“sslmode”键。

另外,单独的 k,v 对也可以用换行符分隔,而不是空格。

现在我想使用正则表达式从给定的字符串中提取唯一键及其对应的值。如果有帮助,我可以列出所有可能出现的键(用户名、密码、主机、sslmode),但理想情况下,我想要一个适用于任何键和值列表的正则表达式解决方案。

如何做到这一点?我知道使用 regexp.FindStringSubmatch 可能是可行的,但我无法全神贯注地编写正则表达式。

【问题讨论】:

  • 如果值包含=,事情可能会变得复杂。看一下lib/pqparseOpts函数的实现。它将键/值对拆分为map[string]string

标签: regex go


【解决方案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 Playground 网址:https://play.golang.org/p/xSEX1CAcQE

【讨论】:

  • 我有一个类似的情况,字符串的第一部分保持静态,我想检查该部分是否存在。我怎样才能做到这一点?示例字符串:ACCESS : user=someone password=something host=superduperhost sslmode=something
  • 一个简单的 strings.HasPrefix 还不够吗?如果您希望该检查也成为正则表达式的一部分,那么我现在不那么熟练地回答它。您可能可以将其作为一个新问题提出。
【解决方案2】:

我个人会看类似的东西:

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

给你输入 \1 和 \2 中的值。

操场上的示例:

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

【讨论】:

  • 请注意,游乐场上 \2 的字符类需要扩展以允许您想要的所有字符。我故意把它缩小了,
猜你喜欢
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多