C# Regex.IsMatch返回false

C# Regex.IsMatch返回false,c#,regex,C#,Regex,我有一个应用程序,我的用户有可能写评论。 但我想用特殊角色过滤侮辱 string comment = "Ðick"; // With special "Ð". comment = Regex.Replace(comment, @"[^a-z0-9 ]", "[a-z]"); // Replace special char by "[a-z]" Regex regex = new Regex(@""+comment +""); // @"[a-z]ick" return (regex.IsMa

我有一个应用程序,我的用户有可能写评论。 但我想用特殊角色过滤侮辱

string comment = "Ðick"; // With special "Ð".

comment = Regex.Replace(comment, @"[^a-z0-9 ]", "[a-z]"); // Replace special char by "[a-z]"
Regex regex = new Regex(@""+comment +""); // @"[a-z]ick"

return (regex.IsMatch("dick")) ? true : false;

当注释仅为“Ðick”时,函数返回true,但如果注释为“Ðick with another word”,则函数返回false。为什么?

你要做的通常是通过规范分解加上“组合变音符号”的去除。你不能用纯正则表达式。。。即使有一点C#你也必须对某些字符手动执行(例如
Ð
D
Ø
O
)。对于其他一些字符,您可以使用
字符串以更“自动化”的方式(如
è
e
)进行处理。规范化
,例如:

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(Ð)
,所以是相同的字符


你试图做的是徒劳的:当你禁止一个角色时,用户会发现另一个“相似”的角色。。。你听说过吗?
D1ck
1
而不是
i
)比你的词好吗?:-)


通常最好有一本“禁词”词典,既有
Dork
又有
ork
,当你发现一个“冒犯”词的新排列时,你只需添加它即可。人类的幻想是无限的。。。所以一定是你的字典:-)一次只能有一个单词。

Replace()
之后
comment
的值是多少?请看这里:简单地禁止所有“特殊”字符可能更容易。IsMatch为我返回true。。。我只是测试了你的同一个代码。“尝试做一个糟糕的单词过滤器是浪费时间。”Rolf van DickThanks,我会禁止使用特殊字符。@LaurieCos这仍然是一个愚蠢的想法:-)即使没有特殊字符,你仍然会有d1ck用户。语言所包含的信息比必要的多。。。你可以从一个单词中删除一两个字母,90%的人仍然能够理解这个单词。