3 回答

TA貢獻(xiàn)1813條經(jīng)驗 獲得超2個贊
前言:我在我的github.com/icza/gox
庫中發(fā)布了這個實用程序,請參閱stringsx.Clean()
。
您可以在報告錯誤的地方刪除符unicode.IsGraphic()
文unicode.IsPrint()
。rune
要從字符串中刪除某些s,您可以使用strings.Map()
.
例如:
invisibleChars := "Douglas"
fmt.Printf("%q\n", invisibleChars)
fmt.Println(len(invisibleChars))
clean := strings.Map(func(r rune) rune {
? ? if unicode.IsGraphic(r) {
? ? ? ? return r
? ? }
? ? return -1
}, invisibleChars)
fmt.Printf("%q\n", clean)
fmt.Println(len(clean))
clean = strings.Map(func(r rune) rune {
? ? if unicode.IsPrint(r) {
? ? ? ? return r
? ? }
? ? return -1
}, invisibleChars)
fmt.Printf("%q\n", clean)
fmt.Println(len(clean))
輸出(在Go Playground上嘗試):
"Douglas\u200b"
10
"Douglas"
7
"Douglas"
7

TA貢獻(xiàn)1831條經(jīng)驗 獲得超9個贊
invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {
return !unicode.IsGraphic(r)
})

TA貢獻(xiàn)1712條經(jīng)驗 獲得超3個贊
僅供參考,
我經(jīng)常使用strings.TrimFunc,但我發(fā)現(xiàn)strings.Map()檢測不可見字符比strings.TrimFunc.
strings.TrimFunc無法檢測輸入字符是否為"Douglas\u200b" + "bar"。如果后面跟有“bar”,則以下示例將失敗。結(jié)果變成了13而不是10。
func ExampleTrimFunc() {
invisibleChars := "Douglas\u200b" + "bar"
invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {
return !unicode.IsGraphic(r)
})
fmt.Println(invisibleChars)
fmt.Println(len(invisibleChars))
normal := "Douglasbar"
fmt.Println(normal)
fmt.Println(len(normal))
// Output:
// Douglasbar
// 10
// Douglasbar
// 10
}
https://go.dev/play/p/TB-98P081U4 @ Go 游樂場
但是,strings.Map()如下使用是成功的。
func ExampleTrimFunc() {
invisibleChars := "Douglas\u200b" + "bar"
- invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {
- return !unicode.IsGraphic(r)
- })
+ invisibleChars = strings.Map(func(r rune) rune {
+ if unicode.IsGraphic(r) {
+ return r
+ }
+ return -1
+ }, invisibleChars)
fmt.Println(invisibleChars)
fmt.Println(len(invisibleChars))
normal := "Douglasbar"
fmt.Println(normal)
fmt.Println(len(normal))
// Output:
// Douglasbar
// 10
// Douglasbar
// 10
}
https://go.dev/play/p/4ybnKVh2NDZ @ Go 游樂場
- 3 回答
- 0 關(guān)注
- 207 瀏覽
添加回答
舉報