3

我在使用负后向正则表达式时遇到问题。我已经阅读了 stackoverflow 结果,恐怕我不太了解它们。

我经营着一个游戏服务器,我有一个工具可以读取用户的聊天记录,如果用户使用了禁用词,就会踢出用户。该工具使用 PERL 正则表达式引擎。

假设我的禁用词是“bag”或“digger”的流行派生词。我可以使用以下正则表达式来匹配包含这些单词的聊天行。

(?i)(digg|bag)(?-i)

我的实际列表中还有其他词。

但是,我想先提供一个警告,它在聊天中显示为:

车主:不要说“挖掘机”

因此,我尝试使用否定的后视来避免匹配我的禁用词列表,因为它前面有“所有者:” - 但是,如果我指定我在“:”和被禁止的文本之间使用的确切文本,我只能让它工作单词 - 我并不总是这样做,并且经常不小心匹配我自己。

我试过使用:

(?<!Owner\:)/s*(?i)(digg|bag)(?-i)

如果只有空格,这有效,但我真正想要的是不匹配:

所有者:挖掘机

拥有者:挖掘机

店主:别拿包来侮辱

业主:(这里还有什么)挖掘

等等,但匹配:

(其他):(任何被禁止的词,不管冒号后面的内容)

由于零宽度断言(我无法绕开我的脑袋),或者我的 regex-fu 很弱,我无法确定在这种语法中我想要的东西是否可能。

我已经尝试了几个教程,并使用了 regex101 解析器,但我不能完全得到我想要的。请问你能帮忙吗?

4

3 回答 3

3

好像你只是想要:

/^(?!Owner:).*(?i:(digg|bag))/s

不以 Owner: 开头并包含(不区分大小写)digg 或 bag 的匹配消息。

于 2016-02-21T03:34:09.193 回答
2
Owner\:\s*.*?(digg|bag)(*SKIP)(*F)|(digg|bag)

您可以(*SKIP)(*F)在出现时使用失败Owner。请参阅演示。

https://regex101.com/r/uE6jQ1/5

于 2016-02-20T20:52:14.750 回答
2

你可以试试这个(?<!Owner):[^:]*?\K(?i:digg|bag)

演示

解释

 (?<! Owner )                  # Not 'Owner' behind colon
 : [^:]*?                      # Colon, then not Colon's up to the ..
 \K                            # Previous, not part of match
 (?i: digg | bag )             # Only the bad word will match $&

如果您希望它在检查Owner位于/接近
开头的地方是面向行的,请使用以下命令:

使用捕获的部分。

(?mi)^(?!\h*Owner:)\h*([^:\r\n]*?):(.*?)(digg|bag)

展开

 (?mi)
 ^  
 (?! \h* Owner: )
 \h*                           # Trim whitespace
 ( [^:\r\n]*? )                # (1), User
 : 
 ( .*? )                       # (2), Before bad word
 ( digg | bag )                # (3), Bad word
于 2016-02-20T20:46:42.410 回答