331 lines
7.5 KiB
Go
331 lines
7.5 KiB
Go
|
|
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
|
|||
|
|
}
|