C# 用于捕捉字母之间带有特殊字符的单词的正则表达式
我不熟悉正则表达式,我正在为注释功能(用C#)编写一个高级亵渎过滤器。为了节省时间,我知道所有的过滤器都可能被愚弄,不管它们有多好,你不必告诉我。我只是想让它比基本单词替换更高级一点。我已经将任务分为几个不同的方法,这是其中之一 我需要的是一段特殊的正则表达式,它捕捉如下字符串:C# 用于捕捉字母之间带有特殊字符的单词的正则表达式,c#,regex,filter,profanity,C#,Regex,Filter,Profanity,我不熟悉正则表达式,我正在为注释功能(用C#)编写一个高级亵渎过滤器。为了节省时间,我知道所有的过滤器都可能被愚弄,不管它们有多好,你不必告诉我。我只是想让它比基本单词替换更高级一点。我已经将任务分为几个不同的方法,这是其中之一 我需要的是一段特殊的正则表达式,它捕捉如下字符串: s_h_i_t s h i t S<>H<>I<>T s_/h_/i_/t s***h***i***t 应始终至少存在一个字符,以避免可能出现的误报,例如 Finish it.
s_h_i_t
s h i t
S<>H<>I<>T
s_/h_/i_/t
s***h***i***t
应始终至少存在一个字符,以避免可能出现的误报,例如
Finish it.
这当然意味着
sh_it
不会被抓到,但正如我所说的,没关系,不一定要完美。我所需要的就是正则表达式,我可以自己做单词拆分和插入正则表达式。我在C#代码中设置了RegexOptions.IgnoreCase选项,因此实际单词中的字符大小写不成问题。此外,此正则表达式不应担心“leetspeek”,即单词的某些实际字母被其他字符替换:
sh1t
我有一个不同的方法来处理这个问题。
提前感谢您的帮助。让我们看看这个正则表达式是否适合您:
/\w(?:_|\W)+/
\bs[\W\u]*h[\W\u]*i[\W\u]*t[\W\u]*(?!\ W)
- 匹配非单词字符、字符
或空白字符(也包括换行符)的字母之间的字符\uuuuz
(word boundrary)确保\b
不匹配完成它
确保sh-ituu不会匹配,您可能需要删除/修改该选项,因为(?!\w)
也不会匹配<代码>\bs[\W\u]*h[\W\u]*i[\W\u]*t+[\W\u]*(?!\ W)将用重复的最后一个字符匹配单词s\u-hittt
- 修改
将使最后一个字符类的匹配不贪婪,并且在\bs[\W\u]*h[\W\u]*i[\W\u]*t[\W\u]*?(?!\ W)
中仅sh it&&&
将匹配sh it
将匹配\bs[\W\d\u]*h[\W\d\u]*i[\W\d\u]*t+[\W\d\u]*?(?!\W)
(字符之间的数字)sh1i444t
[/W]是一个否定的字符类,我认为它等于[^a-zA-Z0-9_u]或[^\W]好吧,哈姆扎的答案有效。但是,在处理解决方案时,我遇到了编程问题。当我只替换单词时,我总是知道单词的长度。所以我知道要用多少星号来代替它。如果我匹配的是
狗屎
,我知道我需要放4个星号。但是如果我匹配的是s[^a-z0-9]+h[^a-z0-9]+[^a-z0-9]+I[^a-z0-9]+t
,我可能会捕捉到s#h#I#t
,或者捕捉到s------h------I------t
。在这两种情况下,匹配文本的长度将与模式的长度相差很大。如何获取匹配字符串的实际长度?您可以使用以下命令:(?I)s[^a-z0-9]*h[^a-z0-9]*I[^a-z0-9]*t
。我在运行中编写了它,所以也许你可以进一步改进它。为了对付像sh1t
这样的事情,你可以使用字符类而不是I
:[i1!]
,对于s
可能[$s5]
。请注意,它可能会导致无效警报。啊,regex不是吗?我希望你将其作为一个答案而不是一个注释发布,因为它实际上是有效的。注意:你将*
更改为+
,这将导致sh it
不匹配。确保使用(?i)s[^a-z0-9]*h[^a-z0-9]*i[^a-z0-9]*t
,或者更好的是使用我的(?i)[$s5][^a-z0-9]*h[^a-z0-9]*[i1!][^a-z0-9]*t
。还有谁在乎长度?你为什么不把它改成***
,因为它原来是4个字符。这是故意的。我希望单词的每个字符之间至少有一个特殊字符。否则,我就有很高的误报风险,比如在“完成它”中匹配“shit”。我宁愿“嘘它”溜过去。正如我所说,没有一个自动的亵渎过滤器是完美的。我已经通过调用Regex.Matches()并遍历MatchCollection得到了长度。但是你的观点很好,我会考虑的。你可以在你的表达式的开头和结尾加上<代码> \b/COD>,这将阻止匹配“完成它”:如果你对一个答案有评论,添加评论。如果你有一个新问题,问一个新问题。你能详细说明一下吗?哪些字符属于单词边界类别?(?!\w)是什么意思?如果我用这个,它会抓住像a_S_H_I_T_a这样的东西吗?我想我知道你要怎么做,但我一开始基本上决定不这么做。我想让“s_h_I_u h_e u a_d”变成“******h_e u a_d”和“s_h_I_u u f u a_e”变成“************f u a_e”。这都是关于人们最有可能做什么。无论如何,这只是版本1,我可以稍后更新正则表达式。还有一件事,我发现S&H&I&T从未被捕获,因为服务器对&A&;进行编码;。我不想替换原始文本中的标记,我想用合适的文字来编码。那么我该如何写[^a-z或这个字符串:“&;”?”来捕捉“&;”,我想您可以使用一个字符类或命名的group。这是一个很好的正则表达式教程
/\w(?:_|\W)+/