1

我是正则表达式的新手,我正在为评论功能(在 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

我有一种不同的方法来处理这个问题。预先感谢您的帮助。

4

3 回答 3

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。在这两种情况下,匹配文本的长度都会与模式的长度大不相同。如何获得匹配字符串的实际长度?

于 2013-06-20T11:51:03.650 回答
1

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

/\w(?:_|\W)+/
于 2013-06-20T09:52:18.880 回答
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

单词边界[/b] 匹配单词开始或结束的地方,长度为0,表示匹配字符之间

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

于 2013-06-20T10:20:52.710 回答