3 回答

TA貢獻1864條經驗 獲得超6個贊
要包含 è、é、à、ò、ì,只需將它們添加到正則表達式:[^\wèéàòìèéàòì]
您也可以使用[^\d\p{Latin}]
,但這會匹配更多字符。
\d
用于數字,\p{Latin}
是所有拉丁字符的 Unicode 類,包括所有變音符號。
例如:
re := regexp.MustCompile(`[^\d\p{Latin}]`) fmt.Println(re.ReplaceAllString(`Test123é?à-???Бла通用`, ""))
將打?。?/p>
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 關注
- 148 瀏覽
添加回答
舉報