如果存在某个单词,则RegEx排除匹配,但不包括另一个部分单词

时间:2012-08-28 15:46:45

标签: regex url filtering firewall

我有防火墙用来阻止成人网站的关键字“暨”,问题是这样做有点太好了,因为这也会阻止任何带有“文档”字样的网址

防火墙将采用正则表达式字符串,我尝试了这个:

^.*(?!document)cum.*$

但它仍然匹配“文档”。我有一种感觉,我应该使用烟斗|,但我不明白。

我想要的是匹配任何地方

*cum*

位于网址(或域名)中,但如果该字词为documentdocuments,则为<。

可能?据我所知,单词边界在这里不起作用,因为单词cum在URL中不一定用空格分隔,如果它在域名中,则绝对不会。

这是另一种说法:

Allow "examplesearchdocuments.com"
Allow "examplemydocuments.com"
Allow "documentexample.com"
Allow "example.com/somedocuments"
Don't allow "funnycumsiteexample.com"
Don't allow "cumallovereverythingexample.com"
Don't allow "exampleseemycum.com"

其中cum是坏词匹配。很抱歉,如果这些示例中的任何一个是真实网站,我不知道如何传达这一点。

2 个答案:

答案 0 :(得分:1)

根据评论,我错了。

如果你在前瞻中使用了一个lookbehind,只有当它不在单词“document”中时才能匹配“cum”。

cum(?!(?<=docum)ent)

以下是关于环视http://www.regular-expressions.info/lookaround.html

的一些阅读

这是针对大量测试的。

http://www.rubular.com/r/b5iZrn6Cjz

答案 1 :(得分:0)

我的第一个建议也是使用\bcum\b作为其他建议,但这与卡明。

使用负面外观(?!)语法几乎正确:

  

^.*(?<!do)cum(?!ent).*$

  

^.*(?<!do)cum(?!ents?).*$

支持复数。 您可以通过单击Java查看您提供的示例来查看:http://fiddle.re/3pyj

我的建议是^.*\bcum.*$匹配单词边界,即单词start和'cum'以及之后的任何内容。