一个比官方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

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过