Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于捕捉字母之间带有特殊字符的单词的正则表达式_C#_Regex_Filter_Profanity - Fatal编程技术网

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.

我不熟悉正则表达式,我正在为注释功能(用C#)编写一个高级亵渎过滤器。为了节省时间,我知道所有的过滤器都可能被愚弄,不管它们有多好,你不必告诉我。我只是想让它比基本单词替换更高级一点。我已经将任务分为几个不同的方法,这是其中之一

我需要的是一段特殊的正则表达式,它捕捉如下字符串:

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
    或空白字符(也包括换行符)的字母之间的字符

  • \b
    (word boundrary)确保
    完成它
    不匹配

  • (?!\w)
    确保sh-ituu不会匹配,您可能需要删除/修改该选项,因为
    s\u-hittt
    也不会匹配<代码>\bs[\W\u]*h[\W\u]*i[\W\u]*t+[\W\u]*(?!\ W)将用重复的最后一个字符匹配单词

  • 修改
    \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-z09])。它的长度为0,这意味着它不会包含在匹配中。如果你想捕捉像“s*h*i*tface”这样的单词,你必须删除它。 ()

单词booundrary[/b]匹配单词开始或结束的位置,其长度为0,这意味着它在字符之间匹配


[/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)+/