正则表达式用于捕捉字母之间的特殊字符

时间:2013-06-20 09:35:35

标签: c# regex filter profanity

我是regex的新手,我正在编写一个用于评论功能的高级亵渎过滤器(在C#中)。为了节省时间,我知道所有过滤器都可以被愚弄,无论它们有多好,你都不必告诉我。我只是想让它比基本的单词替换更先进。我把任务分成几个单独的方法,这就是其中之一。

我需要的是一个特定的正则表达式,它可以捕获这些字符串:

s_h_i_t
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

我有一个不同的方法来解决这个问题。 提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

让我们看看这个正则表达式是否适合你:

/\w(?:_|\W)+/

答案 1 :(得分:1)

\bs[\W_]*h[\W_]*i[\W_]*t[\W_]*(?!\w)

  • 匹配非字母字符或字符_或空白字符(也是新换行符)的字母之间的字符

  • \b(字边界)确保Finish it不匹配

  • (?!\w)确保sh ituuu不匹配,您可能想删除/修改它,因为s_hittt也不匹配。 \bs[\W_]*h[\W_]*i[\W_]*t+[\W_]*(?!\w)会将该字与重复的最后一个字符匹配

  • 修改\bs[\W_]*h[\W_]*i[\W_]*t[\W_]*?(?!\w)会使最后一个字符类的匹配不贪婪,而sh it&&&只有sh it匹配

  • \bs[\W\d_]*h[\W\d_]*i[\W\d_]*t+[\W\d_]*?(?!\w)将匹配sh1i444t(字符间的数字)

修改

(?!\ w)是一个负向前瞻。它基本检查您的匹配是否后跟一个单词字符(单词字符为[A-z09_])。它的长度为0,这意味着它不会包含在匹配中。如果你想捕捉像“s * h * i * tface”这样的词,你将不得不删除它。 (http://www.regular-expressions.info/lookaround.html

一个单词booundrary [/ b]匹配单词开头或结尾的地方,它的长度为0,表示它在字符之间匹配

[/ W]是负字符类,我认为它等于[^ a-zA-Z0-9_]或[^ \ w]

答案 2 :(得分:1)

好吧,HamZa的答案奏效了。但是,在处理解决方案时遇到了程序问题。当我更换单词时,我总是知道这个单词的长度。所以我确切地知道要用多少星号代替它。如果我匹配shit,我知道我需要输入4个星号。但如果我匹配s[^a-z0-9]+h[^a-z0-9]+[^a-z0-9]+i[^a-z0-9]+t,我可能会抓住s#h#i#t或我catch s------h------i--------t。在这两种情况下,匹配文本的长度将与模式的长度大不相同。如何获得匹配字符串的实际长度?