具有可变字符的负面后瞻性正则表达式(PERL)

时间:2016-02-20 20:27:57

标签: regex perl negative-lookbehind

我有一个负面的背后正则表达式的问题。我已经阅读了stackoverflow结果,我担心我不太了解它们。

我操作游戏服务器,我有一个工具可以读取用户的信息。如果用户使用禁止的词,则聊天并踢用户。该工具使用PERL正则表达式引擎。

说我被禁止的单词是" bag"的流行衍生词。或"挖掘机&#​​34;。我可以使用以下正则表达式来匹配包含这些单词的聊天行。

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

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

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

  

所有者:不要说"挖掘机&#​​34;

所以我尝试使用负面的lookbehind来避免匹配我的禁止单词列表,当它前面是"所有者:" - 但是,如果我在":"之间指定我使用的确切文本,我只能让它工作。和被禁止的词 - 我不会经常这样做,并经常意外地匹配我自己。

我试图使用:

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

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

  

者:挖掘机

     

所有者:Digger

     

所有者:不要使用行李作为侮辱

     

所有者:(此处其他任何东西)挖掘

等等,但匹配:

  

(其他任何事情):(任何被禁止的词,无论结肠后面是什么)

如果我想要的东西在这种语法中是可能的,我无法解决,因为零宽度断言(我无法绕过头),或者如果我的正则表达式只是弱。

我已经尝试了几个教程,并使用了regex101解析器,但我无法得到我想要的东西。你能帮忙吗?

3 个答案:

答案 0 :(得分:3)

似乎你只是想要:

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

匹配不以所有者开头的邮件:并包含(不区分大小写)digg或bag。

答案 1 :(得分:2)

您可以尝试此(?<!Owner):[^:]*?\K(?i:digg|bag)

Demo

解释

 (?<! 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

答案 2 :(得分:2)

Owner\:\s*.*?(digg|bag)(*SKIP)(*F)|(digg|bag)

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

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