一个比官方strings.Title更精简高效的将字符串中所有单词首字母转换为大小写的go函数

本文主要是介绍一个比官方strings.Title更精简高效的将字符串中所有单词首字母转换为大小写的go函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在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, -1) // 按照上面的正则切割字符串var sb strings.Buildersb.Grow(len(ss)) // 指定容量为切割后的切片个数for i, v := range ss {if v == "" {continue}r0 := []rune(v)[0]// 如果单词第一个rune是小写或者大写字母  大写字母 65-90  小写字母97-122if r0 <= 122 && ((r0 >= 'A' && r0 <= 'Z') || (r0 >= 'a' && r0 <= 'z')) {wr := falseif isUpper && 'a' <= r0 && r0 <= 'z' {wr = truer0 -= 'a' - 'A' // 转换为大写 小写字母比大写字母的ascii码大32  注意这里的转换大小写必须的前提} else if !isUpper && 'A' <= r0 && r0 <= 'Z' {wr = truer0 += 'a' - 'A' // 转换为小写}if wr {sb.WriteRune(r0)                      // 将转换后的单词第一个rune写入缓存sb.WriteString(string([]rune(v)[1:])) // 写入剩余的rune写入到缓存} else {sb.WriteString(v)}} else { // 非小写或者大写字母,直接原样写入sb.WriteString(v)}if sep != "" && i < len(ss)-1 {sb.WriteString(sep) // 写入单词分隔符}}if sb.Len() > 0 {return sb.String()}return s // 根据单词分隔符切割后的字符为空,原样返回
}// 将字符串中所有单词的第一个字母转换为大写
func Title(s string) string {if len(s) == 0 {return s}return ConvertWrodsFirstUpperLower(s, " ", true)
}// 将字符串中所有单词的第一个字母转换为小写
func UnTitle(s string) string {if len(s) == 0 {return s}return ConvertWrodsFirstUpperLower(s, " ", false)
}

上面代码实现并增强了官方的strings.Title的功能,可以说是Title的升级版, 完整代码见github仓库:http://github.com/tekintian/go-str-utils

官方的string.Title函数参考:

func Title(s string) string {// Use a closure here to remember state.// Hackish but effective. Depends on Map scanning in order and calling// the closure once per rune.prev := ' 'return Map(func(r rune) rune {if isSeparator(prev) {prev = rreturn unicode.ToTitle(r)}prev = rreturn r},s)
}// ToTitle maps the rune to title case.
func ToTitle(r rune) rune {if r <= MaxASCII {if 'a' <= r && r <= 'z' { // title case is upper case for ASCIIr -= 'a' - 'A'}return r}return To(TitleCase, r)
}
// To maps the rune to the specified case: [UpperCase], [LowerCase], or [TitleCase].
func To(_case int, r rune) rune {r, _ = to(_case, r, CaseRanges)return r
}func to(_case int, r rune, caseRange []CaseRange) (mappedRune rune, foundMapping bool) {if _case < 0 || MaxCase <= _case {return ReplacementChar, false // as reasonable an error as any}// binary search over rangeslo := 0hi := len(caseRange)for lo < hi {m := int(uint(lo+hi) >> 1)cr := caseRange[m]if rune(cr.Lo) <= r && r <= rune(cr.Hi) {delta := cr.Delta[_case]if delta > MaxRune {// In an Upper-Lower sequence, which always starts with// an UpperCase letter, the real deltas always look like://	{0, 1, 0}    UpperCase (Lower is next)//	{-1, 0, -1}  LowerCase (Upper, Title are previous)// The characters at even offsets from the beginning of the// sequence are upper case; the ones at odd offsets are lower.// The correct mapping can be done by clearing or setting the low// bit in the sequence offset.// The constants UpperCase and TitleCase are even while LowerCase// is odd so we take the low bit from _case.return rune(cr.Lo) + ((r-rune(cr.Lo))&^1 | rune(_case&1)), true}return r + delta, true}if r < rune(cr.Lo) {hi = m} else {lo = m + 1}}return r, false
}

 

这篇关于一个比官方strings.Title更精简高效的将字符串中所有单词首字母转换为大小写的go函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066705

相关文章

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对