java中字符串分割器_java-Golang中的分割器

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

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

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

这是我尝试过的:

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

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

解决方法:

使用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 ", "[]/"))

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

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

改进之处

如果性能是一个问题,并且您必须多次调用此split()函数,则可以使用分隔符创建一个类似于集合的映射,然后重用该映射,因此可以在传递给strings.FieldFunc()的函数内部使用,您可以简单地检查该符文是否在此映射中,因此您无需调用string.IndexRune()即可确定给定符文是否为分隔符.

如果分隔符字符很少(例如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))

输出是相同的.在Go Playground上尝试此功能.

标签:go,split,string,java

来源: https://codeday.me/bug/20191108/2008753.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值