3 回答
TA贡献1813条经验 获得超2个赞
前言:我在我的github.com/icza/gox
库中发布了这个实用程序,请参阅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贡献1831条经验 获得超9个赞
invisibleChars = strings.TrimFunc(invisibleChars, func(r rune) bool {
return !unicode.IsGraphic(r)
})
TA贡献1712条经验 获得超3个赞
仅供参考,
我经常使用strings.TrimFunc,但我发现strings.Map()检测不可见字符比strings.TrimFunc.
strings.TrimFunc无法检测输入字符是否为"Douglas\u200b" + "bar"。如果后面跟有“bar”,则以下示例将失败。结果变成了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 关注
- 142 浏览
添加回答
举报