如何将字符串的第一个字母大写

Posted

技术标签:

【中文标题】如何将字符串的第一个字母大写【英文标题】:How to capitalize the first letter of a string 【发布时间】:2022-01-09 08:29:06 【问题描述】:

我有一个这样的字符串

var sentence string = "the biggest ocean is the Pacific ocean"

我希望能够将输入字符串中的第一个字母t大写,这样字符串就变成了

"The biggest ocean is the Pacific ocean"

如何在 Go 中做到这一点?

我尝试过使用strings.Titlestrings.ToTitle,但是它们没有做我想做的事情。

【问题讨论】:

【参考方案1】:

假设您的输入字符串是有效的 UTF-8,这个线程 (Golang - ToUpper() on a single byte?) 就足够接近了,虽然不是完全完美的副本。我们可以在此基础上,在字符串的第一个 rune 上使用 unicode.ToUpper 得出一个可接受的解决方案。

    r := []rune(s)
    r[0] = unicode.ToUpper(r[0])
    s := string(r)

或者使用“聪明”的单线:

    s := string(append([]runeunicode.ToUpper(r[0]), r[1:]...))

与字符串不同,符文切片不是不可变的,因此您可以将第一个符文替换为 ToUpper,这将处理非 ASCII 和/或具有大写字母的多字节代码点(例如俄语)和别管那些不知道的(例如亚洲脚本)

注意: UPPER case 和 TITLE case 是有区别的,简单解释here。简而言之,像DŽ 这样的二合字母将有不同的标题大小写(Dž,只有第一个字素大写)和大写(DŽ,两个字素都大写)。如果您确实需要大写字母,请使用unicode.ToTitle

注意 2:string[]rune 之间的转换涉及复制,因为您从不可变字符串中获得了可变切片。如果您希望在对性能敏感的代码中使用您的应用程序,请对其进行分析。

游乐场:https://go.dev/play/p/HpCBM7cRflZ


如果您有一个相当大的输入字符串,其中完整的符文切片转换变得过于昂贵,您可以在某个分隔符上使用带上限的strings.SplitN 来解决此问题,本质上是提取文本的第一个单词并仅在转换:

sep := " "
ss := strings.SplitN(s, sep, 2)

r := []rune(ss[0])
r[0] = unicode.ToUpper(r[0])

s = string(r) + sep + ss[1])

使用约 30K 输入字符串进行基准测试显示出显着差异:

go test -v -bench=. -benchmem
goos: darwin
goarch: arm64
pkg: example.com
BenchmarkRuneConv-10            6376        183691 ns/op      258049 B/op          3 allocs/op
BenchmarkSplitN-10           1709989           706.1 ns/op      4152 B/op          3 allocs/op
PASS
ok      example.com 3.477s

【讨论】:

“聪明”的单行不工作。你能修好它吗? Cannot use 'r[0]' (type uint8) as the type rune. @FredHors 等等,你如何声明 rr 应该是一片符文,而不是字符串本身。如果你检查链接的游乐场,你可以看到它是如何使用的 哦。我认为那是一根绳子。 @Ineedanswers 这应该是答案。 如果我需要使用这个函数给一个很长的字符串,你有什么提示吗?我能得到第一个字吗?怎么样?【参考方案2】:

获取第一个符文,符文的标题大小写并重新组装字符串:

sentence := "the biggest ocean is the Pacific ocean"
r, i := utf8.DecodeRuneInString(sentence)
sentence = string(unicode.ToTitle(r)) + sentence[i:]
fmt.Println(sentence)

【讨论】:

utf8.DecodeRuneInString 可能会为空输入字符串返回RuneError(或者如果字符串的开头有无效符文) - 所以可能需要检查。【参考方案3】:

达到预期结果的最简单方法是使用strings.ToUpper() 函数。 Refer

    var input string = "the biggest ocean is the Pacific ocean"
    res := strings.ToUpper(input[:1]) + input[1:]

    fmt.Println(res)

你可以试试goplayground

【讨论】:

字符串索引 [] 不适用于多字节输入:go.dev/play/p/0-bi1WmC1AX【参考方案4】:

我有一个简单的解决方案。

这是我在 Github 上的某人项目的一个分支

https://github.com/CleanMachine1/capitalise

要使用它,只需在终端中运行:

go mod init MODULENAME
go get github.com/cleanmachine1/capitalise

然后在你的代码中你可以使用


package main

import ("github.com/cleanmachine1/capitalise")

func main()
 sentence = capitalise.First(sentence)

【讨论】:

能够使用“指定”int的附加功能也很好,谢谢 @CleanMachine1 引用 repo 代码可能会更成功 - 而不是将解决方案绑定到第三方包。

以上是关于如何将字符串的第一个字母大写的主要内容,如果未能解决你的问题,请参考以下文章

如何在飞镖中将字符串的第一个字母大写?

Java如何将每个单词的第一个字符转为大写?

使用Angular或打字稿将字符串的第一个字母大写[重复]

Java如何将每个单词的第一个字符转为大写

将字符串的第一个字母大写,而不触及其他字母

java 如何将一个字符串数组每行的第一个英文字母变成大写