根据空格拆分子字符串golang数量有限

时间:2019-05-04 17:07:08

标签: go

我需要组合string.SplitN和strings.SplitFunc。输入的字符串可能有任何kind of whitespace,我只需要前两个拆分的子字符串,其余的字符串应在另一轮运行中解析。 SplitN函数将输入最多分割为N个参数,但只考虑空格而不是空格。您可以在SplitFunc中定义特殊的拆分器,在我的情况下,如下所示:

f := func(r rune) bool {
    return unicode.IsSpace(r)
}

但是我无法在SplitFunc中定义子字符串的数量。

函数strings.Fields也没有用,因为该函数没有限制。

3 个答案:

答案 0 :(得分:1)

regexp拆分似乎可以满足您的要求

s := regexp.MustCompile("[[:space:]]+")
r:=s.Split("the     final conflict.  Of Cheese", 3)
    fmt.Println("first two ",r[:2])
    fmt.Println("remaining ",r[2:])
}

https://play.golang.org/p/-uoIljx0fKN

答案 1 :(得分:0)

您可以在循环中使用strings.IndexFunc,同时根据找到的索引从左开始修剪字符串。

一个幼稚的实现可能看起来像:

func findN(s string, limit int) []string {
    var found []string
    for i := 0; i < limit; i++ {
        nextIndex := strings.IndexFunc(s, unicode.IsSpace)
        if nextIndex < 0 {
            break
        }
        found = append(found, s[:nextIndex])
        s = s[nextIndex+1:]

    }
    return found
}

整个代码在这里:https://play.golang.org/p/IZb8aV20ILW

答案 2 :(得分:-2)

我是这样写答案的:首先使用string.Fields然后抓取我想要的子字符串并从源字符串中删除它们

package main

import (
    "fmt"
    "strings"
)

func main() {
    str := "      "

    substr, len := findN(str, 2)
    fmt.Printf("%q\n%d", substr, len)
}

func findN(str string, limit int) ([]string, int) {
    if len(str) <= 0 {
        return nil, 0
    }
    var substr []string
    for i := 0; i < limit; i++ {
        splitedS := strings.Fields(str)
        if len(splitedS) < 1 {
            break
        }
        v := splitedS[0]
        substr = append(substr, v)
        str = strings.TrimSpace(str)
        str = strings.TrimPrefix(str, v)
        str = strings.TrimSpace(str)
    }
    str = strings.TrimSpace(str)
    if str != "" {
        substr = append(substr, str)
    }
    return substr, len(substr)
}

https://play.golang.org/p/kQnbYbP_hXf