【问题标题】:How can I use/access capture groups in Go? [duplicate]如何在 Go 中使用/访问捕获组? [复制]
【发布时间】:2019-12-10 05:13:22
【问题描述】:

我有一个日期格式为 dd.mm.yyyy 的文件(例如 31.12.2019)。 我想转换成格式 yyyy-mm-dd(例如 2019-12-31)。

在 Notepad++ 中,我可以使用反向引用对这些字符串进行搜索和替换:

搜索:

(\d{2}).(\d{2}).(\d{4})

替换:

\3-\2-\1

我将如何使用 Go 执行此操作?

【问题讨论】:

    标签: regex string go replace


    【解决方案1】:

    你可以通过分割你的输入字符串,并以不同的顺序组装部件来做到这一点:

    func transform(s string) string {
        d, m, y := s[:2], s[3:5], s[6:]
        return y + "-" + m + "-" + d
    }
    

    注意:上述函数不会验证输入,如果输入短于 6 个字节,它可能会崩溃。

    如果您需要输入验证(包括日期验证),您可以使用time 包来解析日期,并将其格式化为您的预期输出:

    func transform2(s string) (string, error) {
        t, err := time.Parse("02.01.2006", s)
        if err != nil {
            return "", err
        }
        return t.Format("2006-01-02"), nil
    }
    

    测试上述功能:

    fmt.Println(transform("31.12.2019"))
    fmt.Println(transform2("31.12.2019"))
    

    输出(在 Go Playground 上尝试):

    2019-12-31
    2019-12-31 <nil>
    

    【讨论】:

    • 谢谢,transform2 可能会完成这项工作。文件结构不是那么简单,例如:Bremen;Osterferien;2017;10.04.2017 - 22.04.2017 Bremen;Pfingstferien;2017;26.05.2017;06.06.2017 Bremen;Herbstferien;2017;02.10.2017 - 14.10.2017;30.10 .2017 所以我首先必须捕获所有日期,然后转换它们,然后用一些替换方法将它们写回字符串。这是正确的策略吗?
    • @Blockhuette 您可以使用strings.Split() 拆分行,然后您将获得日期。然后,您可以使用此处介绍的转换。您也可以使用encoding/csv 将文件作为 CSV 读取/处理,然后通过读取行​​来获得“单元格”。
    【解决方案2】:

    正则表达式可能是矫枉过正,因为您有如此明确的输入。这个怎么样:

      var dmy = strings.Split("31.12.2019",".")
      var mdy = []string{dmy[1],dmy[0],dmy[2]}
      fmt.Println(strings.Join(mdy, "-"))
    

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

    【讨论】:

    • var mdy = []string{dmy[2],dmy[1],dmy[0]} //建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2020-01-22
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多