将字符串中每个单词的首字母大写

56

我有一个字符串的大数组,例如这个:

"INTEGRATED ENGINEERING 5 Year (BSC with a Year in Industry)"

我想将每个单词的首字母大写,并将其余部分小写。因此,INTEGRATED 将变为 Integrated

但是还有一个问题 - 我希望对一些单词进行例外处理,如 and, in, a, with

因此,上面的示例将变为:

"Integrated Engineering 5 Year (Bsc with a Year in Industry)"

我该如何在Go中做到这一点?我可以编写循环/数组来管理更改,但实际的字符串转换是我遇到困难的地方。

5个回答

132

在内置的strings包中有一个叫做Title的函数。

s := "INTEGRATED ENGINEERING 5 Year (BSC with a Year in Industry)"
fmt.Println(strings.Title(strings.ToLower(s)))

https://go.dev/play/p/THsIzD3ZCF9


3
这个答案如何应对问题中提到的例外情况?(以及,用一种方式,带着) - tomasz
10
注意使用这个函数,strings.Title 会将 ' 后面的字符也变成大写。 例如:strings.Title("capitlize's me") => Capitlize'S Me - Nhan Tran
8
strings.Title 现已弃用:https://pkg.go.dev/strings#Title - Micah Parks
没错,@Micah Parks 是对的。更改内容请参见:https://pkg.go.dev/strings#ToTitle - rtut
3
@rtut 这是不正确的,strings.ToTitle() 会将所有字符都大写,并且不会替换 strings.Title() - Taehan Stott
2
这个函数在新版本的Golang中已被弃用,现在推荐使用golang.org/x/text/cases这个包来处理这个用例。 - Margach Chris

16
你可以使用正则表达式 regular expressions 来完成这个任务。一个 \w+ 的正则表达式将匹配所有单词,然后通过使用 Regexp.ReplaceAllStringFunc,你可以用所需的内容替换单词,跳过停用词。在你的情况下,strings.ToLowerstrings.Title 也会很有帮助。
例子:
str := "INTEGRATED ENGINEERING 5 Year (BSC with a Year in Industry)"

// Function replacing words (assuming lower case input)
replace := func(word string) string {
    switch word {
    case "with", "in", "a":
        return word
    }
    return strings.Title(word)
}

r := regexp.MustCompile(`\w+`)
str = r.ReplaceAllStringFunc(strings.ToLower(str), replace)

fmt.Println(str)

// Output:
// Integrated Engineering 5 Year (Bsc with a Year in Industry)

https://play.golang.org/p/uMag7buHG8

你可以轻松地将此适应于你的字符串数组。

使用\pL(Unicode字母)代替\w(仅ASCII)用于自由文本。您的解决方案会给出“Manager Of Two CaféS in QuéBec”)。此外,请注意标题已被弃用(请参见@TomiEcio的答案)。 - Betamos

16
以下是一个可替代已被弃用的答案的示例,它与strings#Title相关,使用了cases#Title。请参考以下代码:
package main

import (
    "fmt"
    "golang.org/x/text/cases"
    "golang.org/x/text/language"
)

func main() {
    msg := "INTEGRATED ENGINEERING 5 Year (BSC with a Year in Industry)"
    fmt.Println(cases.Title(language.English, cases.Compact).String(msg))
}

3
要使字符串的第一个字母大写,请使用以下代码:cases.Title(language.English, cases.NoLower).String(msg) - Asad-ullah Khan

0
在 Go 1.18 中,strings.Title() 被弃用。
这里,你可以了解现在应该使用什么。
引用中写道:
你应该使用 cases.Title。

-27

嗯,你没有指定你使用的语言,所以我会给你一个通用的答案。你有一个包含许多字符串的数组。首先,我会将整个字符串转换为小写,然后遍历字符串中的每个字符(将第一个字符大写,其余保持小写)。此时,你需要寻找空格,这将帮助你分割每个字符串中的单词。在找到空格后的第一个字符显然是一个不同的单词,并且应该大写。你还可以验证下一个单词是否是"and"、"in"或者"or"。

我现在没有电脑,所以无法给出具体的示例,但我希望这能至少帮助你朝正确的方向前进。


9
他正在使用Go语言。Tag是主要指标,虽然它也在问题中提到过。 - tomasz
尽管该层看不清语言是Go,但思路是正确的。 - ElapsedSoul
其次,我认为这个问题的重点与使用哪种编程语言无关。从“我不在电脑旁”这句话中,我们可以得知该层正在使用手机,因此对于小错误是可以接受的,所以我提高了答案的评分,以表彰该层的热情和正确的想法。 - ElapsedSoul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接