在字符串中将单词的第一个字母设为大写

Con*_*nor 19 go

我有一大堆字符串,例如:

'综合工程5年(工业年度平衡计分卡)'

我想将单词的第一个字母大写,并将其余单词设为小写.所以'INTEGRATED'会变成'整合'.

作品中的第二个扳手 - 我想要一些例外,例如'和','in','a','with'.

所以上面的例子将成为:

综合工程5年(工业年度Bsc).

我怎么在Go中这样做?我可以编写循环/数组来管理更改,但实际的字符串转换是我所挣扎的.

bou*_*oug 52

在字符串包中有一个内置函数调用 strings

请参阅https://play.golang.org/p/07dl3hMuGH

  • `strings.Title` 现已弃用:https://pkg.go.dev/strings#Title (8认同)
  • 请小心使用此函数,strings.Title 也会将 ''' 之后的字符转为大写。例如: `strings.Title("capitlize'S Me")` => `Capitlize'S Me` (7认同)
  • 您可能希望在调用Title func之前先将文本小写 (5认同)
  • @rtut这是不正确的,`strings.ToTitle()`使所有字符大写并且不会替换`strings.Title()` (3认同)
  • 此函数在新版本的 Golang 中已弃用,现在推荐此包用于此用例 ```golang.org/x/text/cases``` (3认同)
  • 答案如何解决问题中提到的异常?(并且,在一个,与) (2认同)

Sau*_*abh 23

以下是已接受答案的替代方案,现已弃用

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))
}
Run Code Online (Sandbox Code Playgroud)

  • 仅使字符串的第一个字母大写,使用:`cases.Title(language.English,cases.NoLower).String(msg)` (7认同)

tom*_*asz 9

您可以使用正则表达式执行此任务.正则\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)
Run Code Online (Sandbox Code Playgroud)

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

您可以轻松地将其调整为您的字符串数组.