Java 戈兰的斯普利特
下面是Java代码,我需要类似的Go: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解决方案也不复杂 您可以使用拆分一组字符上的字符串,并去除前导和尾随空格 下面是一个简单的函数,
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看起来不错。应该可以方便地处理更多字符