为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
杨魅力 2022-10-17 19:28:41
我需要从字符串中删除 GO 中除重音字母以外的所有符号。我的代码改为删除所有包含重音字母的符号:str := "cafè!?"reg, err := regexp.Compile(`[^\w]`)str := reg.ReplaceAllString(str, " ")我期望以下输出:cafè但是我的代码的输出是:caf我想包括 è、é、à、ò、ì (当然还有从 a 到 z 的所有字母和从 0 到 9 的数字)我能怎么做?谢谢你的帮助
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

要包含 è、é、à、ò、ì,只需将它们添加到正则表达式:[^\wèéàòìÈÉÀÒÌ]

您也可以使用[^\d\p{Latin}],但这会匹配更多字符。

\d用于数字,\p{Latin}是所有拉丁字符的 Unicode 类,包括所有变音符号。

例如:

re := regexp.MustCompile(`[^\d\p{Latin}]`)
fmt.Println(re.ReplaceAllString(`Test123éËà-ŞŨğБла通用`, ""))

将打印:

Test123éËàŞŨğ


查看完整回答
反对 回复 2022-10-17
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

这里所有的“特殊”字符都是标点符号(我假设也是符号)字符,所以使用

[\p{P}\p{S}]+

如果要删除任何字符但需要使用的任何字母

\P{L}+

请参阅正则表达式演示 #1正则表达式演示 #2。这里,

  • \p{P}匹配任何适当的标点符号(如逗号、点)

  • \p{S}符号,如数学等符号

  • \P{L}- Unicode 字母以外的任何字符。


查看完整回答
反对 回复 2022-10-17
?
慕标5832272

TA贡献1966条经验 获得超4个赞

您可以使用 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̴̧̟̞̞̠̯͈͔̽̎͋̅́̈̅̊̒文本)。它将排除某些字符,例如零宽度连接符,这会导致某些语言中的单词被破坏......所以如果您关心国际受众,您可能需要查看您的受众是否使用零宽度连接符。因此,这将破坏某些脚本,例如梵文。


查看完整回答
反对 回复 2022-10-17
  • 3 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信