在Go中删除字符串中的非字母数字字符的方法

2,082 阅读2分钟

要清除围棋中所有非字母数字字符的字符串,最好是使用匹配非字母数字字符的正则表达式,并用空字符串替换它们。这样的regex ,被定义为允许的字符集的否定。对于英文字母来说,它就是。

[^a-zA-Z0-9 ]+

在这个正则表达式中,我们在方括号[^ 之后使用了Caret字符,这意味着它可以匹配除小写和大写字母a-z 、数字和空格字符之外的任何字符。"不是字母、不是数字、不是空格 "是我们对非字母数字字符的定义。

然而,在处理英文以外的字母时,这样的正则表达式将不能正常工作。在这种情况下,我们可以使用regex 中的Unicode 类别,而不是手动定义字母和数字的范围,我们可以对字母使用 Unicode 类别\p{L} ,对数字使用\p{N}

[^\p{L}\p{N} ]+

这个正则表达式匹配任何不属于Unicode字母和数字或空格字符的字符。

要比较这些正则表达式和删除非字母数字字符的函数的结果,请看下面两个例子。

删除英文字母字符串的所有非字母数字字符

这是一个从字符串中删除非字母数字字符的典型例子。首先,我们编译我们的正则表达式,匹配除英文字母、数字或空格以外的任何字符。然后,我们使用 Regexp.ReplaceAllString()方法将匹配的非字母数字字符替换为空字符串"" 。看一下输出结果,注意这个方法同时删除了非英文字母(ـا, ą)和数字(٦)。

package main
import (
"fmt"
"regexp"
)
var nonAlphanumericRegex = regexp.MustCompile(`[^a-zA-Z0-9 ]+`)
func clearString(str string) string {
return nonAlphanumericRegex.ReplaceAllString(str, "")
}
func main() {
str := "Test@%String#321gosamples.dev ـا ą ٦"
fmt.Println(clearString(str))
}

输出

TestString321gosamplesdev

移除非英文字母字符串的所有非字母数字字符

这个例子和前面的例子一样,但是通过使用带有Unicode类别的正则表达式,我们也接受英语以外的字母和数字,比如阿拉伯语。

package main
import (
"fmt"
"regexp"
)
var nonAlphanumericRegex = regexp.MustCompile(`[^\p{L}\p{N} ]+`)
func clearString(str string) string {
return nonAlphanumericRegex.ReplaceAllString(str, "")
}
func main() {
str := "Test@%String#321gosamples.dev ـا ą ٦"
fmt.Println(clearString(str))
}

输出

TestString321gosamplesdev ـا ą ٦