我需要组合string.SplitN和strings.SplitFunc。输入的字符串可能有任何kind of whitespace,我只需要前两个拆分的子字符串,其余的字符串应在另一轮运行中解析。 SplitN函数将输入最多分割为N个参数,但只考虑空格而不是空格。您可以在SplitFunc中定义特殊的拆分器,在我的情况下,如下所示:
f := func(r rune) bool {
return unicode.IsSpace(r)
}
但是我无法在SplitFunc中定义子字符串的数量。
函数strings.Fields也没有用,因为该函数没有限制。
答案 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:])
}
答案 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
}
答案 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)
}