删除所有特殊字符,但不删除重音字母

我需要从字符串中删除 GO 中除重音字母以外的所有符号。我的代码改为删除所有包含重音字母的符号:


str := "cafè!?"

reg, err := regexp.Compile(`[^\w]`)

str := reg.ReplaceAllString(str, " ")

我期望以下输出:


cafè

但是我的代码的输出是:


caf

我想包括 è、é、à、ò、ì (当然还有从 a 到 z 的所有字母和从 0 到 9 的数字)


我能怎么做?谢谢你的帮助


杨魅力
浏览 160回答 3
3回答

慕尼黑的夜晚无繁华

要包含 è、é、à、ò、ì,只需将它们添加到正则表达式:[^\wèéàòìÈÉÀÒÌ]您也可以使用[^\d\p{Latin}],但这会匹配更多字符。\d用于数字,\p{Latin}是所有拉丁字符的 Unicode 类,包括所有变音符号。例如:re := regexp.MustCompile(`[^\d\p{Latin}]`) fmt.Println(re.ReplaceAllString(`Test123éËà-ŞŨğБла通用`, ""))将打印:Test123éËàŞŨğ

泛舟湖上清波郎朗

这里所有的“特殊”字符都是标点符号(我假设也是符号)字符,所以使用[\p{P}\p{S}]+如果要删除任何字符但需要使用的任何字母\P{L}+请参阅正则表达式演示 #1和正则表达式演示 #2。这里,\p{P}匹配任何适当的标点符号(如逗号、点)\p{S}符号,如数学等符号\P{L}- Unicode 字母以外的任何字符。

慕标5832272

您可以使用 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̵̙̞͈̥̳̗͙͚͛̀͘O̴̧̟̞̞̠̯͈͔̽̎͋̅́̈̅̊̒文本)。它将排除某些字符,例如零宽度连接符,这会导致某些语言中的单词被破坏......所以如果您关心国际受众,您可能需要查看您的受众是否使用零宽度连接符。因此,这将破坏某些脚本,例如梵文。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go