package stringUtil import ( "fmt" "strconv" "strings" "goutil/mathUtil" ) // 使用多分隔符来进行分割(默认分隔符为:",", ";", ":", "|", "||") // eg:1,2;3|4||5,6;7|8||9 // 返回值: // []string func Split(s string, seps []string) []string { retList := make([]string, 0, 32) // 如果seps为nil,则使用默认值 if seps == nil { seps = []string{",", ";", ":", "|", "||"} } // 根据所有的分隔符来一点一点地切割字符串,直到不可切割为止 for { startIndex := len(s) - 1 endIndex := 0 exists := false // 遍历,找到第一个分割的位置 for _, sep := range seps { index := strings.Index(s, sep) // 如果找到有匹配项,则寻找最小的pos,如果有多个相同的pos,则使用长度最长的分隔符 if index > -1 { exists = true // 说明有多个有效的分隔符,如|和|| if index < startIndex { startIndex = index endIndex = startIndex + len(sep) - 1 } else if index == startIndex { if startIndex+len(sep)-1 > endIndex { endIndex = startIndex + len(sep) - 1 } } } } // 如果没有找到匹配的pos,则分割过程结束 if !exists { retList = append(retList, s) break } // 切割字符串 sub := s[:startIndex] if sub != "" { retList = append(retList, sub) } s = s[endIndex+1:] } return retList } // 将字符串切割为[]int // str:输入字符串 // 返回值: // []int // error func SplitToIntSlice(s, sep string) ([]int, error) { // 先按照分隔符进行切割 strSlice := strings.Split(s, sep) // 定义int slice intSlice := make([]int, 0, len(strSlice)) for _, value := range strSlice { // 去除空格 if value = strings.TrimSpace(value); value == "" { continue } if value_int, err := strconv.Atoi(value); err != nil { return nil, err } else { intSlice = append(intSlice, value_int) } } return intSlice, nil } // 将字符串切割为[]int32 // s:输入字符串 // 返回值: // []int // error func SplitToInt32Slice(s, sep string) ([]int32, error) { // 先获得int slice count := 0 intSlice, err := SplitToIntSlice(s, sep) if err != nil { return nil, err } else { count = len(intSlice) } // 定义int32 slice int32Slice := make([]int32, 0, count) for _, item := range intSlice { int32Slice = append(int32Slice, int32(item)) } return int32Slice, nil } // 将字符串切割为[]int64 // s:输入字符串 // 返回值: // []int64 // error func SplitToInt64Slice(s, sep string) ([]int64, error) { // 先获得int slice count := 0 intSlice, err := SplitToIntSlice(s, sep) if err != nil { return nil, err } else { count = len(intSlice) } // 定义int32 slice int64Slice := make([]int64, 0, count) for _, item := range intSlice { int64Slice = append(int64Slice, int64(item)) } return int64Slice, nil } // 将字符串切割为[]float64 // s:输入字符串 // 返回值: // []float64 // error func SplitToFloat64Slice(s, sep string) ([]float64, error) { // 先按照分隔符进行切割 strSlice := strings.Split(s, sep) // 定义float64 slice floatSlice := make([]float64, 0, len(strSlice)) for _, value := range strSlice { // 去除空格 if value = strings.TrimSpace(value); value == "" { continue } if value_float, err := strconv.ParseFloat(value, 64); err != nil { return nil, err } else { floatSlice = append(floatSlice, value_float) } } return floatSlice, nil } // 将字符串切割为map[int32]int32 // s:输入字符串 // 返回值: // map[int32]float32 // error func SplitToDict_KintVint(s, outerSep, innerSep string) (map[int32]int32, error) { // 先按照分隔符进行切割 outerSlice := strings.Split(s, outerSep) // 定义map[int32]float32 floatMap := make(map[int32]int32, len(outerSlice)) for _, itemStr := range outerSlice { innerSlice := strings.Split(strings.TrimSpace(itemStr), innerSep) key := strings.TrimSpace(innerSlice[0]) value := strings.TrimSpace(innerSlice[1]) key_int, err := strconv.Atoi(key) if err != nil { return nil, err } value_int, err := strconv.Atoi(value) if err != nil { return nil, err } floatMap[int32(key_int)] = int32(value_int) } return floatMap, nil } // 将字符串切割为map[int32]string // s:输入字符串 // 返回值: // map[int32]string // error func SplitToDict_KintVstring(s, outerSep, innerSep string) (map[int32]string, error) { // 先按照分隔符进行切割 outerSlice := strings.Split(s, outerSep) // 定义map[int32]string resultMap := make(map[int32]string, len(outerSlice)) for _, itemStr := range outerSlice { innerSlice := strings.Split(strings.TrimSpace(itemStr), innerSep) key := strings.TrimSpace(innerSlice[0]) value := strings.TrimSpace(innerSlice[1]) key_int, err := strconv.Atoi(key) if err != nil { return nil, err } resultMap[int32(key_int)] = value } return resultMap, nil } // 将字符串切割为map[int32]float32 // s:输入字符串 // 返回值: // map[int32]float32 // error func SplitToDict_KintVfloat(s, outerSep, innerSep string) (map[int32]float32, error) { // 先按照分隔符进行切割 outerSlice := strings.Split(s, outerSep) // 定义map[int32]float32 floatMap := make(map[int32]float32, len(outerSlice)) for _, itemStr := range outerSlice { innerSlice := strings.Split(strings.TrimSpace(itemStr), innerSep) key := strings.TrimSpace(innerSlice[0]) value := strings.TrimSpace(innerSlice[1]) key_int, err := strconv.Atoi(key) if err != nil { return nil, err } value_float, err := strconv.ParseFloat(value, 64) if err != nil { return nil, err } floatMap[int32(key_int)] = float32(value_float) } return floatMap, nil } // 将字符串切割为map[int32]float32 // s:输入字符串 // 返回值: // map[int32]float32 // error func SplitToDict_KintVfloat64(s, outerSep, innerSep string) (map[int32]float64, error) { // 先按照分隔符进行切割 outerSlice := strings.Split(s, outerSep) // 定义map[int32]float32 floatMap := make(map[int32]float64, len(outerSlice)) for _, itemStr := range outerSlice { innerSlice := strings.Split(strings.TrimSpace(itemStr), innerSep) key := strings.TrimSpace(innerSlice[0]) value := strings.TrimSpace(innerSlice[1]) key_int, err := strconv.Atoi(key) if err != nil { return nil, err } value_float, err := strconv.ParseFloat(value, 64) if err != nil { return nil, err } floatMap[int32(key_int)] = float64(value_float) } return floatMap, nil } // 将字符串切割为IntRegion列表 // s:输入字符串,形如:1-200,201-400,401-1000 // outerSep:外部分隔符 // innerSep:内部分隔符 // 返回值: // IntRegion列表 // 错误对象 func SplitToIntRegion(s, outerSep, innerSep string) (intRegionList []*mathUtil.IntRegion, err error) { if s == "" { err = fmt.Errorf("Input is empty") return } outerRegionList := make([]string, 0, 4) outerRegionList = strings.Split(s, outerSep) if len(outerRegionList) == 0 { err = fmt.Errorf("%s:Format invalid. Such as:1-100,101-200", s) return } for _, item := range outerRegionList { innerRegionList := make([]string, 0, 2) innerRegionList = strings.Split(item, innerSep) if len(innerRegionList) != 2 { err = fmt.Errorf("%s:Format invalid. Such as:1-100", item) return } var lower, upper int lower, err = strconv.Atoi(innerRegionList[0]) if err != nil { return } upper, err = strconv.Atoi(innerRegionList[1]) if err != nil { return } if lower > upper { err = fmt.Errorf("lower:%d should less than upper:%d", lower, upper) return } intRegionList = append(intRegionList, mathUtil.NewIntRegion(lower, upper)) } return }