猿问

Golang 中的片段

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


List<String> tokens = Lists.newArrayList(Splitter.on(CharMatcher.anyOf("[]//"))

.trimResults().omitEmptyStrings().split(entry.getValue()))

这是我试过的:


re := regexp.MustCompile(`[//]`)

tokens := re.Split(entry, -1)


慕侠2389804
浏览 105回答 1
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 个字符),性能提升可能并不显着,但如果您有更多分隔符,则使用映射可以显着提高性能。这就是它的样子: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))输出是一样的。
随时随地看视频慕课网APP

相关分类

Go
我要回答