亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang 中的拆分器

Golang 中的拆分器

Cats萌萌 2021-09-29 17:05:22
下面是Java代碼,我在Go 中需要類似的東西:List<String> tokens = Lists.newArrayList(Splitter.on(CharMatcher.anyOf("[]//")).trimResults().omitEmptyStrings().split(entry.getValue()))這是我嘗試過的:re := regexp.MustCompile(`[//]`)tokens := re.Split(entry, -1)
查看完整描述

1 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

使用正則表達式通常比手動執行要慢。由于任務并不復雜,因此非正則表達式解決方案也不復雜。


您可以使用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))

輸出是一樣的。在Go Playground上試試這個。


查看完整回答
反對 回復 2021-09-29
  • 1 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號