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%的人仍然能够理解这个单词。