ASMach
ASMach

Reputation: 101

How to split Golang strings without deleting separator?

According to the answer at How to split a string and assign it to variables in Golang? splitting a string results in an array of strings where the separator is not present in any of the strings in the array. Is there a way to split strings such that the separator is on the last line of a given string?

e.x.

s := strings.split("Potato:Salad:Popcorn:Cheese", ":")
for _, element := range s {
    fmt.Printf(element)
}

outputs:

Potato
Salad
Popcorn
Cheese

I wish to output the following instead:

Potato:
Salad:
Popcorn:
Cheese

I know I could theoretically append ":" to the end of each element except for the last, but I'm looking for a more general, elegant solution if possible.

Upvotes: 5

Views: 5443

Answers (3)

Anshu
Anshu

Reputation: 1337

Try this to get the proper result.

package main

    import (
        "fmt"
        "strings"
    )

    func main() {
        str := "Potato:Salad:Popcorn:Cheese"
        a := strings.SplitAfter(str, ":")
        for i := 0; i < len(a); i++ {
            fmt.Println(a[i])
        }
    }

Upvotes: 0

reticentroot
reticentroot

Reputation: 3682

The answer above by daplho great and simple. Sometimes I just like to provide an alternative to remove the magic of a function

package main

import "fmt"

var s = "Potato:Salad:Popcorn:Cheese"

func main() {
    a := split(s, ':')
    fmt.Println(a)
}

func split(s string, sep rune) []string {
    var a []string
    var j int
    for i, r := range s {
        if r == sep {
            a = append(a, s[j:i+1])
            j = i + 1
        }
    }
    a = append(a, s[j:])
    return a
}

https://goplay.space/#h9sDd1gjjZw

As a side note, the standard lib version is better than the hasty one above

goos: darwin
goarch: amd64
BenchmarkSplit-4             5000000           339 ns/op
BenchmarkSplitAfter-4       10000000           143 ns/op

So go with that lol

Upvotes: 1

daplho
daplho

Reputation: 1135

You are looking for SplitAfter.

s := strings.SplitAfter("Potato:Salad:Popcorn:Cheese", ":")
  for _, element := range s {
  fmt.Println(element)
}
// Potato:
// Salad:
// Popcorn:
// Cheese

Go Playground

Upvotes: 14

Related Questions