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



我需要从字符串中删除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(。它将排除某些字符,如零宽度连接符,这将导致某些语言中的单词被损坏。。。因此,如果你关心国际受众,你可能需要回顾一下你的受众是否使用了零宽度连接符。因此,这将破坏某些脚本,如天成文书。

最新更新