Java 戈兰的斯普利特

Java 戈兰的斯普利特,java,string,go,split,Java,String,Go,Split,下面是Java代码,我需要类似的Go: List<String> tokens = Lists.newArrayList(Splitter.on(CharMatcher.anyOf("[]//")) .trimResults().omitEmptyStrings().split(entry.getValue())) 使用regexp通常比手动执行要慢。由于任务并不复杂,因此非regexp解决方案也不复杂 您可以使用拆分一组字符上的字符串,并去除前导和尾随空格 下面是一个简单的函数,

下面是Java代码,我需要类似的Go

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

使用regexp通常比手动执行要慢。由于任务并不复杂,因此非regexp解决方案也不复杂

您可以使用拆分一组字符上的字符串,并去除前导和尾随空格

下面是一个简单的函数,可以实现您想要的功能:

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 ", "[]/"))
fmt.Printf("%q\n", split("a,b;c, de; ; fg ", sep1))
fmt.Printf("%q\n", split("a[b]c[ de/ / fg ", sep2))
输出(在上尝试):

改进 如果性能是一个问题,并且您必须多次调用此
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 ", ",;"))
fmt.Printf("%q\n", split("a[b]c[ de/ / fg ", "[]/"))
fmt.Printf("%q\n", split("a,b;c, de; ; fg ", sep1))
fmt.Printf("%q\n", split("a[b]c[ de/ / fg ", sep2))

输出是相同的。在.

上尝试此选项,您尝试过做什么?re:=regexp.MustCompile(
[/]
)标记:=re.Split(entry,-1)相关代码应添加到您的问题中,而不是发布在注释中。另外,它应该作为一个标签发布,并解释问题的确切位置是在某些字符上拆分是->strings.FieldsFunc看起来不错。应该可以方便地处理更多字符