gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/stringx/stringx.go (about)

     1  package stringx
     2  
     3  import (
     4  	"math"
     5  	"regexp"
     6  	"strings"
     7  	"unicode"
     8  )
     9  
    10  // CamelToUnderline 驼峰 to 下划线
    11  func CamelToUnderline(target string) string {
    12  	return strings.Join(SplitUpper(target), "_")
    13  }
    14  
    15  // UnderlineToCamel 下划线 to 驼峰
    16  func UnderlineToCamel(target string) string {
    17  	arr := strings.Split(target, "_")
    18  	for i, val := range arr {
    19  		arr[i] = UpperFirst(val)
    20  	}
    21  	return strings.Join(arr, "")
    22  }
    23  
    24  // 清楚空白的地方,包括空格,换行符,tab等
    25  func CleanSpace(str string) string {
    26  	str = strings.ReplaceAll(str, " ", "")
    27  	str = strings.ReplaceAll(str, "\t", "")
    28  	str = strings.ReplaceAll(str, "\n", "")
    29  	str = strings.ReplaceAll(str, "\r", "")
    30  	return str
    31  }
    32  
    33  // Reverse 翻转字符串
    34  func Reverse(str string) string {
    35  	l := len(str)
    36  	b := make([]byte, l)
    37  	for i, val := range []byte(str) {
    38  		b[l-i-1] = val
    39  	}
    40  	return string(b)
    41  }
    42  
    43  // SplitUpper 按照大小写分组
    44  func SplitUpper(target string) []string {
    45  	chars := []byte(target)
    46  	result := []string{}
    47  	str := ""
    48  	for i := 0; i < len(target); i++ {
    49  		char := chars[i]
    50  		if i == 0 {
    51  
    52  		} else if char >= 65 && char <= 90 {
    53  			result = append(result, str)
    54  			str = ""
    55  		}
    56  
    57  		str += string(char)
    58  	}
    59  
    60  	result = append(result, str)
    61  	return result
    62  }
    63  
    64  // SplitLast 获取字符串被"."分离后的字符串数组中
    65  // ,最后一个字符串。
    66  func SplitLast(str string, sep string) string {
    67  	strArr := strings.Split(str, sep)
    68  	if strArr != nil && len(strArr) > 0 {
    69  		return strArr[len(strArr)-1]
    70  	}
    71  
    72  	return str
    73  }
    74  
    75  // IsLowerFirst 首字母是否小写
    76  func IsLowerFirst(str string) bool {
    77  	first := str[0]
    78  	if first >= 97 && first <= 122 {
    79  		return true
    80  	}
    81  	return false
    82  }
    83  
    84  // IsUpperFirst 首字母是否大写
    85  func IsUpperFirst(str string) bool {
    86  	first := str[0]
    87  	if first >= 65 && first <= 90 {
    88  		return true
    89  	}
    90  	return false
    91  }
    92  
    93  // FillFirst 填充直到长度
    94  func FillFirst(str string, length int, char string) string {
    95  	lstr := len(str)
    96  	if lstr < length {
    97  		for i := lstr; i < length; i++ {
    98  			str = char + str
    99  		}
   100  	}
   101  	return str
   102  }
   103  
   104  // FillLast 填充直到长度
   105  func FillLast(str string, length int, char string) string {
   106  	lstr := len(str)
   107  	if lstr < length {
   108  		for i := lstr; i < length; i++ {
   109  			str = str + char
   110  		}
   111  	}
   112  	return str
   113  }
   114  
   115  // LowerFirst 首字母小写
   116  func LowerFirst(str string) string {
   117  	first := str[:1]
   118  	return strings.Replace(str, first, strings.ToLower(first), 1)
   119  }
   120  
   121  // UpperFirst 首字母大写
   122  func UpperFirst(str string) string {
   123  	if len(str) == 0 {
   124  		return str
   125  	}
   126  
   127  	first := str[:1]
   128  
   129  	return strings.Replace(str, first, strings.ToUpper(first), 1)
   130  }
   131  
   132  // DeleteExtraSpace 删除字符串中多余的空格(含tab),有多个空格时,仅保留一个空格,同时将字符串中的tab换为空格
   133  func DeleteExtraSpace(s string) string {
   134  	//删除字符串中的多余空格,有多个空格时,仅保留一个空格
   135  	s1 := strings.Replace(s, "  ", " ", -1)      //替换tab为空格
   136  	regstr := "\\s{2,}"                          //两个及两个以上空格的正则表达式
   137  	reg, _ := regexp.Compile(regstr)             //编译正则表达式
   138  	s2 := make([]byte, len(s1))                  //定义字符数组切片
   139  	copy(s2, s1)                                 //将字符串复制到切片
   140  	spc_index := reg.FindStringIndex(string(s2)) //在字符串中搜索
   141  	for len(spc_index) > 0 {                     //找到适配项
   142  		s2 = append(s2[:spc_index[0]+1], s2[spc_index[1]:]...) //删除多余空格
   143  		spc_index = reg.FindStringIndex(string(s2))            //继续在字符串中搜索
   144  	}
   145  	return string(s2)
   146  }
   147  
   148  // GetStrLength 返回输入的字符串的字数,汉字和中文标点算 1 个字数,英文和其他字符 2 个算 1 个字数,不足 1 个算 1个
   149  func GetStrLength(str string) float64 {
   150  	var total float64
   151  
   152  	reg := regexp.MustCompile("/·|,|。|《|》|‘|’|”|“|;|:|【|】|?|(|)|、/")
   153  
   154  	for _, r := range str {
   155  		if unicode.Is(unicode.Scripts["Han"], r) || reg.Match([]byte(string(r))) {
   156  			total = total + 1
   157  		} else {
   158  			total = total + 0.5
   159  		}
   160  	}
   161  
   162  	return math.Ceil(total)
   163  }