java - Golang 中的拆分器

标签 java string go split

下面是Java代码,我在Go中需要类似的东西:

List<String> tokens = Lists.newArrayList(Splitter.on(CharMatcher.anyOf("[]//"))
.trimResults().omitEmptyStrings().split(entry.getValue()))

这是我试过的:

re := regexp.MustCompile(`[//]`)
tokens := re.Split(entry, -1)

最佳答案

使用正则表达式通常比手动操作慢。由于任务并不复杂,因此非正则表达式解决方案也不复杂。

您可以使用 strings.FieldsFunc()在一组字符上拆分字符串,以及 strings.TrimSpace()去除前导和尾随空格。

这是一个简单的函数,可以执行您想要的操作:

func split(s, sep string) (tokens []string) {
    fields := strings.FieldsFunc(s, func(r rune) bool {
        return strings.IndexRune(sep, r) != -1
    })
    for _, s2 := range fields {
        s2 = strings.TrimSpace(s2)
        if s2 != "" {
            tokens = append(tokens, s2)
        }
    }
    return
}

测试它:

fmt.Printf("%q\n", split("a,b;c, de; ; fg ", ",;"))
fmt.Printf("%q\n", split("a[b]c[ de/ / fg ", "[]/"))

输出(在 Go Playground 上尝试):

["a" "b" "c" "de" "fg"]
["a" "b" "c" "de" "fg"]

改进

如果性能是一个问题并且您必须多次调用此 split() 函数,那么从分隔符创建一个类似集合的映射并重用它会是有利可图的,所以在里面传递给 strings.FieldFunc() 的函数,您可以简单地检查 rune 是否在此映射中,因此您不需要调用 strings.IndexRune( ) 来决定给定的 rune 是否是分隔符。

如果您的分隔符很少(例如 1-3 个字符),性能提升可能并不显着,但如果您有更多分隔符,则使用 map 可以显着提高性能。

它可能是这样的:

var (
    sep1 = map[rune]bool{',': true, ';': true}
    sep2 = map[rune]bool{'[': true, ']': true, '/': true}
)

func split(s string, sep map[rune]bool) (tokens []string) {
    fields := strings.FieldsFunc(s, func(r rune) bool {
        return sep[r]
    })
    for _, s2 := range fields {
        s2 = strings.TrimSpace(s2)
        if s2 != "" {
            tokens = append(tokens, s2)
        }
    }
    return
}

测试它:

fmt.Printf("%q\n", split("a,b;c, de; ; fg ", sep1))
fmt.Printf("%q\n", split("a[b]c[ de/ / fg ", sep2))

输出是一样的。在 Go Playground 上试试这个.

关于java - Golang 中的拆分器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424185/

相关文章:

java - 从 super 对象创建子对象

C# 多行字符串与 html

java - 如何用 ""分隔字符串并将它们存储到2个不同的数组中?

docker - 从 ubuntu 18.04 升级到 18.10 后,docker 容器内没有互联网连接

go - 指针接收器与值接收器混淆

java - WebRTC - 具有本地服务器的 ApprtcDemo 不适用于 Android 原生 PC 浏览器

java - 使用 @ManyToOne 的 Hibernate join 获取关联实体会抛出 EntityNotFoundException

java - 生成丰富的:menu hierarchical structure from rich:tree

java - 如何检测页面中是否包含句子(模糊)?

go - 如何为网络,存储和计算编写GCP Cloud API实现