将包含字符串键/值的文件转换为Go映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将包含字符串键/值的文件转换为Go映射相关的知识,希望对你有一定的参考价值。

我有一个文件,其中包含由=符号分隔的字符串键/值对。它看起来像这样:

"some.key" = "A cool value.";
"some.other.key" = "A cool value with %@ chars and 
. Another Thing.";
"escaped.key" = "A cool "value".";
"multiline.key.value" = "1. First sentence is "cool"
2. Second sentence
3. Third sentence
4. Fourth sentence";

请注意,值可以在其中转义引号,并且它们也可以跨越多行。

我已经尝试过基本的引用匹配,但是它没有处理值中的转义引号等等......这就是我现在正在尝试的内容:

file, err := ioutil.ReadFile("/my/string/file")
if err != nil {
    log.Fatal(err)
}

re := regexp.MustCompile(`".*?"`)
match := re.FindAllString(string(file), -1)
fmt.Println(match)

任何帮助将不胜感激:D

答案

一种不同的方法 - 您可以使用具有自定义split function的扫描仪来分割您的对分隔符;并扫描每个单独的密钥对。然后用“ - ”分割键值对文本以分割键和值。

file, err := os.Open("/my/string/file")
if err != nil {
    log.Fatal(err)
}
defer f.Close()

scanner := bufio.NewScanner(f)
scanner.Split(customSplitFunc)
for scanner.Scan() {
    fmt.Println("Key-Value Pair: ", scanner.Text())
    //Split scanner.Text() by "=" to split key and value
}

并定义customSplitFunc,如下所示

func customSplitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }

    if atEOF {
        return len(data), data, nil
    }

    //; followed by newline is the k-v pair delimiter
    if i := strings.Index(string(data), ";
"); i >= 0 {
        //skip the delimiter in advancing to the next pair
        return i + 2, data[0:i], nil
    }
    return
}
另一答案

^"(.+?)(?<!\)"s*=s*"([sS]*?)(?<!\)";匹配两组中的键和值,假设它们都是"key" = "value";形式。键和值可以有转义报价。空键不匹配。

然后,您可以使用\ 替换为跨越多行的值。

我在(?<!\)背后使用负面看法,以确保引号前面没有反斜杠。

另一答案

我认为(?m)^"([^"]+)"s*=s*"(([^"]|(\")|(\ ))+)";$做你想要的。与FindAllStringSubmatch一起使用它将返回所有匹配的对。请注意,如果任何输入的语法无效,则整个内容将不匹配,因此可能不是您想要的。

func main() {
    re := regexp.MustCompile(`(?m)^"([^"]+)"s*=s*"(([^"]|(\")|(\
))+)";$`)
    matches := re.FindAllStringSubmatch(`"some.key" = "A cool value.";
"some.other.key" = "A cool value with %@ chars and 
. Another Thing.";
"escaped.key" = "A cool "value".";
"multiline.key.value" = "1. First sentence is "cool"
2. Second sentence
3. Third sentence
4. Fourth sentence";
`, -1)
    for _, m := range matches {
        fmt.Printf("%q %q
", m[1], m[2])
    }
}

(我在输入的第四行添加了缺少的反斜杠。)

https://play.golang.org/p/ZHV8jpg17nY

以上是关于将包含字符串键/值的文件转换为Go映射的主要内容,如果未能解决你的问题,请参考以下文章

Go教程映射

Go教程映射

Go教程映射

Java 8:如何从包含为映射值的列表中获取值?

将对象数组转换为包含键和值的对象作为对象数组

如何使用 Java 库将标记的 YAML 对象转换为 JSON 对象?