3 回答
TA贡献1864条经验 获得超6个赞
要包含 è、é、à、ò、ì,只需将它们添加到正则表达式:[^\wèéàòìÈÉÀÒÌ]
您也可以使用[^\d\p{Latin}]
,但这会匹配更多字符。
\d
用于数字,\p{Latin}
是所有拉丁字符的 Unicode 类,包括所有变音符号。
例如:
re := regexp.MustCompile(`[^\d\p{Latin}]`) fmt.Println(re.ReplaceAllString(`Test123éËà-ŞŨğБла通用`, ""))
将打印:
Test123éËàŞŨğ
TA贡献1818条经验 获得超3个赞
这里所有的“特殊”字符都是标点符号(我假设也是符号)字符,所以使用
[\p{P}\p{S}]+
如果要删除任何字符但需要使用的任何字母
\P{L}+
请参阅正则表达式演示 #1和正则表达式演示 #2。这里,
\p{P}
匹配任何适当的标点符号(如逗号、点)\p{S}
符号,如数学等符号\P{L}
- Unicode 字母以外的任何字符。
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̴̧̟̞̞̠̯͈͔̽̎͋̅́̈̅̊̒文本)。它将排除某些字符,例如零宽度连接符,这会导致某些语言中的单词被破坏......所以如果您关心国际受众,您可能需要查看您的受众是否使用零宽度连接符。因此,这将破坏某些脚本,例如梵文。
- 3 回答
- 0 关注
- 102 浏览
添加回答
举报