替换string中每个第n个字符实例

时间:2017-06-28 08:12:55

标签: regex string go replace

我对Go有点新,但我正在尝试用逗号替换我的字符串的每个第n个实例。例如,我的部分数据如下所示:

"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,

我想将every 6th comma替换为'\n',因此它看起来像

"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769"
"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506"
"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991"

我查看了regexp包,这似乎只是一个查找器。 strings包确实有替换,但我不知道如何使用它来替换特定的索引。我也不知道如何找到特定的索引而不经过整个字符串逐个字符。我想知道是否有一个比我编写辅助函数更优雅的regEx解决方案。 字符串是不可变的,因此我无法在适当的位置编辑它们。

编辑:将字符串转换为[]字节。这允许我在适当的位置编辑字符串。然后其余的是一个相当简单的for循环,其中dat是数据。

3 个答案:

答案 0 :(得分:1)

如果这是您的输入,则应将,"字符串替换为\n"。您可以使用strings.Replace()进行此操作。这将留下最后一个尾随的逗号,您可以使用切片删除它。

解决方案:

in := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,`
out := strings.Replace(in, ",\"", "\n\"", -1)
out = out[:len(out)-1]
fmt.Println(out)

输出是(在Go Playground上尝试):

"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769
"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506
"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991

答案 1 :(得分:1)

如果你想要灵活。

package main

import (
    "fmt"
    "strings"
)

func main() {
    input := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,`
    var result []string

    for len(input) > 0 {
        token := strings.SplitN(input, ",", 7)
        s := strings.Join(token[0:6], ",")
        result = append(result, s)
        input = input[len(s):]
        input = strings.Trim(input, ",")
    }
    fmt.Println(result)
}

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

答案 2 :(得分:1)

所以我弄清楚我做错了什么。我最初将数据作为string,但如果我将其转换为byte[],那么我可以将其更新到位。

这允许我使用下面的简单for循环来解决问题,而不依赖于除第n个字符实例之外的任何其他指标

for i := 0; i < len(dat); i++ {
    if dat[i] == ',' {
        count += 1
    }
    if count%6 == 0 && dat[i] == ',' {
        dat[i] = '\n'
        count = 0
    }