正则表达式如何从key value字符串中把所有key和value取出来?

实例代码

有一个长的字符串str,现在要做的是把里面存在的key-value对,都给读出来,不是很清楚要如何做.

package main

import (
    "fmt"
    "regexp"
)

var str = `username="mengjiaheng",realm="Digest test",qop=auth,nonce="410640120104011==",uri="/index",nc=0000001,cnonce="1626405084726364600",response="d48ac2ea9b740ea1d0052ed528d73f87"`

func main() {

    re := regexp.MustCompile(`([^=]+)=([^,]+)[,]*`)
    str := re.FindAllStringSubmatch(str, -1)
    fmt.Printf("%q\n", str)
}

下面是我上面代码的运行结果,我想把 " 给去掉,但是我不会操作了,希望大家给点建议

[["username=\"mengjiaheng\"," "username" "\"mengjiaheng\""] ["realm=\"Digest test\"," "realm" "\"Digest test\""] ["qop=auth," "qop" "auth"] ["nonce=\"410640120104011==\"," "nonce" "\"410640120104011==\""] ["uri=\"/index\"," "uri" "\"/index\""] ["nc=0000001," "nc" "0000001"] ["cnonce=\"1626405084726364600\"," "cnonce" "\"1626405084726364600\""] ["response=\"d48ac2ea9b740ea1d0052ed528d73f87\"" "response" "\"d48ac2ea9b740ea1d0052ed528d73f87\""]]
附言 1  ·  2年前

[["username=\"mengjiaheng\"," "username" "\"mengjiaheng\""] ["realm=\"Digest test\"," "realm" "\"Digest test\""] ["qop=auth," "qop" "auth"] ["nonce=\"410640120104011==\"," "nonce" "\"410640120104011==\""] ["uri=\"/index\"," "uri" "\"/index\""] ["nc=0000001," "nc" "0000001"] ["cnonce=\"1626405084726364600\"," "cnonce" "\"1626405084726364600\""] ["response=\"d48ac2ea9b740ea1d0052ed528d73f87\"" "response" "\"d48ac2ea9b740ea1d0052ed528d73f87\""]]

最佳答案

把你正则匹配那句话换成: re := regexp.MustCompile(`([^=]+)=["]*([^,"]+)["]*[,]*`) ,我得出的效果是这样的,不知道是你要的那种结果嘛?我用的是 Println 输出的,和你用 Printf 输出结果。

# Println 打印
[[username="mengjiaheng", username mengjiaheng] [realm="Digest test", realm Digest test] [qop=auth, qop auth] [nonce="410640120104011==", nonce 410640120104011==] [uri="/index", uri /index] [nc=0000001, nc 0000001] [cnonce="1626405084726364600", cnonce 1626405084726364600] [response="d48ac2ea9b740ea1d0052ed528d73f87" response d48ac2ea9b740ea1d0052ed528d73f87]]

# 你的字符串格式化方式打印结果
[["username=\"mengjiaheng\"," "username" "mengjiaheng"] ["realm=\"Digest test\"," "realm" "Digest test"] ["qop=auth," "qop" "auth"] ["nonce=\"410640120104011==\"," "nonce" "410640120104011=="] ["uri=\"/index\"," "uri" "/index"] ["nc=0000001," "nc" "0000001"] ["cnonce=\"1626405084726364600\"," "cnonce" "1626405084726364600"] ["response=\"d48ac2ea9b740ea1d0052ed528d73f87\"" "response" "d48ac2ea9b740ea1d0052ed528d73f87"]]
2年前 评论
mjh18438323830 (楼主) 2年前
讨论数量: 2
package main

import (
    "fmt"
    "strings"
)

var str = `username="mengjiaheng",realm="Digest test",qop=auth,nonce="410640120104011==",uri="/index",nc=0000001,cnonce="1626405084726364600",response="d48ac2ea9b740ea1d0052ed528d73f87"`

func main() {
    split := strings.Split(str, ",") // 逗号拆分
    m := make(map[string]string, len(split))
    for _, s := range split {
        kvs := strings.Split(s, "=") // 等号拆分
        if len(kvs) != 2 {
            continue
        }
        m[kvs[0]] = strings.ReplaceAll(kvs[1], `"`, "") // 引号替换掉
    }
    fmt.Println(m)
}
2年前 评论
mjh18438323830 (楼主) 2年前

把你正则匹配那句话换成: re := regexp.MustCompile(`([^=]+)=["]*([^,"]+)["]*[,]*`) ,我得出的效果是这样的,不知道是你要的那种结果嘛?我用的是 Println 输出的,和你用 Printf 输出结果。

# Println 打印
[[username="mengjiaheng", username mengjiaheng] [realm="Digest test", realm Digest test] [qop=auth, qop auth] [nonce="410640120104011==", nonce 410640120104011==] [uri="/index", uri /index] [nc=0000001, nc 0000001] [cnonce="1626405084726364600", cnonce 1626405084726364600] [response="d48ac2ea9b740ea1d0052ed528d73f87" response d48ac2ea9b740ea1d0052ed528d73f87]]

# 你的字符串格式化方式打印结果
[["username=\"mengjiaheng\"," "username" "mengjiaheng"] ["realm=\"Digest test\"," "realm" "Digest test"] ["qop=auth," "qop" "auth"] ["nonce=\"410640120104011==\"," "nonce" "410640120104011=="] ["uri=\"/index\"," "uri" "/index"] ["nc=0000001," "nc" "0000001"] ["cnonce=\"1626405084726364600\"," "cnonce" "1626405084726364600"] ["response=\"d48ac2ea9b740ea1d0052ed528d73f87\"" "response" "d48ac2ea9b740ea1d0052ed528d73f87"]]
2年前 评论
mjh18438323830 (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!