5

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.

2
  • You can try to search for :, and get the sub string via index, without a split() method. Commented Aug 15, 2018 at 1:10
  • you can use Regex golang.org/pkg/regexp/#Regexp.FindAllString Commented Aug 15, 2018 at 1:15

3 Answers 3

14

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

Sign up to request clarification or add additional context in comments.

Comments

1

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

1 Comment

As golang is open-source, a peek under the hood readily reveals SplitAfter's implementation. It utilizes the genSplit function: go.googlesource.com/go/+/master/src/strings/strings.go#240
0

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])
        }
    }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.