我需要从字符串中删除GO中除重音字母外的所有符号。我的代码删除了所有包含重音字母的符号:
str := "cafè!?"
reg, err := regexp.Compile(`[^w]`)
str := reg.ReplaceAllString(str, " ")
我期望以下输出:
cafè
但我的代码的输出是:
caf
我想包括è,é,à,å,ì(当然还有从a到z的所有字母和从0到9的数字(
我该怎么办?感谢您的帮助
要包含è、é、à、å、ì,只需将它们添加到正则表达式中即可:[^wèéàòìÈÉÀÒÌ]
您也可以使用[^dp{Latin}]
,但这将匹配更多的字符。
d
代表数字,p{Latin}
是所有拉丁字符(包括所有变音符号(的Unicode类。
例如:
re := regexp.MustCompile(`[^dp{Latin}]`)
fmt.Println(re.ReplaceAllString(`Test123éËà-ŞŨğБла通用`, ""))
将打印:
Test123éËàŞŨğ
All"特别的";这里的字符是标点符号(我想也是符号(字符,所以使用
[p{P}p{S}]+
如果你想删除任何字符,但任何字母,你需要使用
P{L}+
请参阅regex演示#1和regex演示#2。这里,
p{P}
匹配任何适当的标点符号(如逗号、句点(p{S}
符号,如数学符号等P{L}
-Unicode字母以外的任何字符
您可以使用Unicode文本分割库来迭代字形簇,并检查每个字形簇中的第一个符文是否具有正确的类别(字母或数字(。
import (
"strings"
"unicode"
"github.com/rivo/uniseg"
)
func stripSpecial(s string) string {
var b strings.Builder
gr := uniseg.NewGraphemes(s)
for gr.Next() {
r := gr.Runes()[0]
if unicode.IsLetter(r) || unicode.IsDigit(r) {
b.WriteString(gr.Str())
}
}
return b.String()
}
该代码的工作原理是首先将字符串分解为字形簇,
"cafè!?" -> ["c", "a", "f", "è", "!", "?"]
每个字形簇可以包含多个Unicode代码点。第一个代码点决定字符的类型,其余的代码点(如果有的话(是重音标记或其他修饰符。所以我们过滤并连接:
["c", "a", "f", "è"] -> "cafè"
这将通过任何重音或非重音的字母和数字,无论它们是如何标准化的,也无论什么重音(包括z̰̬̒̚(g(。它将排除某些字符,如零宽度连接符,这将导致某些语言中的单词被损坏。。。因此,如果你关心国际受众,你可能需要回顾一下你的受众是否使用了零宽度连接符。因此,这将破坏某些脚本,如天成文书。