То, что вы пытаетесь сделать, часто делается с канонической декомпозицией плюс снятие «Сочетания диакритических знаков». Вы не можете сделать это с чистым регулярным выражением ... и даже имея немного C#, вы должны сделать это вручную для некоторых символов (например, Ð
- D
или Ø
- O
). Для некоторых других символов, которые вы можете сделать это в более «автоматизированной» способом (например, è
к e
) с помощью string.Normalize
, как:
string comment = "Ðè";
// Here we split (è) to U+0065 (e) U+0300 (̀)
string commentNormalized = comment.Normalize(NormalizationForm.FormD);
// Here we remove all the UnicodeCategory.NonSpacingMark
// that are the diacritics like U+0300 (̀)
// and rebuild the string. This line can be speedup a little, but
// it would be longer to write :-)
string comment2 = new string(commentNormalized.Where(x => char.GetUnicodeCategory(x) != UnicodeCategory.NonSpacingMark).ToArray());
Теперь comment2
является "Ðe"
.
Это потому, что è имеет «каноническое разложение» U+0065 (e) U+0300 (̀)
, так что вы можете обнаружить, что è
«подобен» в e
, в то время как для Ð это «Каноническое разложение» по-прежнему U+00D0 (Ð)
так же характер.
То, что вы пытаетесь сделать, бесполезно: когда вы запрещаете персонажа, пользователи найдут еще один «похожий» характер ... вы когда-нибудь слышали о Leet? Есть D1ck
(1
вместо i
) лучше, чем ваше слово? :-)
Как правило, лучше иметь словарь «запрещенных слов», который имеет как Dork
, так и Ðork
, и когда вы найдете новую перестановку «оскорбительного» слова, вы просто добавляете его. Человеческая фантазия бесконечна ... так что должен быть ваш словарь :-), но одно слово за раз.
Каково значение 'comment' после' Replace() '? – CodeCaster
см. Здесь: https://msdn.microsoft.com/en-us/library/20bw873z(v=vs.110).aspx – Nostradamus
Может быть проще просто запретить все специальные символы. –