在go语言的官方包 strings中,官方提供了Title函数用于将字符串中的单词首字母转换为大写,这个函数很绕,对于要转换的字符串先是一个Map循环,然后接着又是一个Map循环,且函数调函数掉了好多层,而且最新版本中已经标记为过时,推荐使用一个更绕的golang.org/x/text/cases包中的函数进行转换。
下面的函数使用了高效的正则来切割字符串,同时支持自定义切割字符来对字符串中的所有单词的首字母进行转换, 废话不多说,直接上代码:
// 转换字符串中单词的首字母大小写
//
// s 待转换的字符串
// sep 单词分隔符 如果指定了分隔符且不为空同时字符串中包含指定分隔符,则返回的字符串中的单词将会带上这个分隔符,否则分隔符全部会被设置为空
// isUpper 是否转换为大写 true 是, false 否(转换为小写)
//
// 使用示例:
//
// ConvertWrodsFirstUpperLower("hello word","",true) // HelloWorld
// ConvertWrodsFirstUpperLower("Hello Word"," ",false) // hello world
//
// 返回转换后的字符串
func ConvertWrodsFirstUpperLower(s, sep string, isUpper bool) string {
// 定义切割字符串的正则
regexp := `(\s+|\n|\r|\t|\f|\v|_|-|\b)`
// 如果sep不为空,且字符串中包含用户提供的分隔符,则将分隔符放入到正则中
if sep != "" && strings.Contains(s, sep) {
regexp = fmt.Sprintf(`(%s|\s+|\n|\r|\t|\f|\v|_|-|\b)`, sep)
} else {
sep = "" // 其他情况将分隔符设置为空
}
re, err := GetRegexp(regexp)
if err != nil {
return s
}
ss := re.Split(s, -