如何在不删除分隔符的情况下分割Golang字符串?

时间:2018-08-15 01:03:44

标签: string go split

根据How to split a string and assign it to variables in Golang?处的答案,分割字符串会生成一个字符串数组,其中该数组的任何字符串中都没有分隔符。有没有一种方法可以分割字符串,使分隔符位于给定字符串的最后一行?

e.x。

(defproject gn-preview-api "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url  "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.9.0"]]
  :main gn-preview-api.www.app
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}
             :staging {:aot :all}
             :live    {:aot :all}
             :dev     {:plugins      [[lein-ring "0.9.7"]]
                       :dependencies [[javax.servlet/servlet-api "2.5"]]}})

输出:

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

我希望输出以下内容:

Potato
Salad
Popcorn
Cheese

我知道从理论上讲,我可以在每个元素的末尾附加“:”,但如果可能的话,我正在寻找更通用,更优雅的解决方案。

3 个答案:

答案 0 :(得分:7)

您正在寻找SplitAfter

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

Go Playground

答案 1 :(得分:1)

尝试此操作以获得正确的结果

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

答案 2 :(得分:0)

以上daplho的回答非常简单。有时我只是想提供一种替代方法来消除功能的魔力

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

请注意,标准的lib版本比上面的草率版本更好

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

那么就笑吧