Go语言 `strings.split`可以忽略空标记吗?

tp5buhyn  于 2023-11-14  发布在  Go
关注(0)|答案(4)|浏览(100)

你能演示一种有效的方法来使用strings.split,使空令牌不包含在返回的切片中吗?
具体来说,下面的代码返回["a" "" "b" "c"],我希望它返回["a" "b" "c"]

fmt.Printf("%q\n", strings.Split("a,,b,c", ","))

字符串
https://play.golang.org/p/keaSjjSxgn

k2arahey

k2arahey1#

简单回答:strings.Split不能这样做。
然而,在Go语言中有更多的函数来分割字符串。值得注意的是,你可以用strings.FieldsFunc做你想做的事情。下面的例子:

splitFn := func(c rune) bool {
        return c == ','
}
fmt.Printf("Fields are: %q\n", strings.FieldsFunc("a,,b,c", splitFn))

字符串
在操场上:https://play.golang.org/p/Lp1LsoIxAK

628mspwn

628mspwn2#

您可以从数组中筛选出空元素,因此可以将此作为第二步来执行。

package main

import (
    "fmt"
    "strings"
)

func delete_empty (s []string) []string {
    var r []string
    for _, str := range s {
        if str != "" {
            r = append(r, str)
        }
    }
    return r
}

func main() {
    var arr = strings.Split("a,,b,c", ",");
    fmt.Printf("%q\n", delete_empty(arr));
}

字符串
更新了Golang Playground

yzxexxkh

yzxexxkh3#

如果使用regexp是可以接受的,你可以在1+分隔符上分割:

package main
import (
  "fmt"
  "regexp"
)

func main() {
  fmt.Printf("%q\n", regexp.MustCompile(",+").Split("a,,b,c", -1))
}

字符串
Playground link

cgvd09ve

cgvd09ve4#

Go 1.21 slices包中有一个DeleteFunc函数,可以用来删除切片中的空项。

package main

import (
    "fmt"
    "slices"
    "strings"
)

func main() {

    items := slices.DeleteFunc(strings.Split("a,,b,c", ","), func(e string) bool {
        return e == ""
    })
    fmt.Println(items)

}

字符串
产出:

[a b c]

相关问题