我是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
我有一个不同的方法来解决这个问题。 提前感谢您的帮助。
答案 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
。在这两种情况下,匹配文本的长度将与模式的长度大不相同。如何获得匹配字符串的实际长度?