我有一个负面的背后正则表达式的问题。我已经阅读了stackoverflow结果,我担心我不太了解它们。
我操作游戏服务器,我有一个工具可以读取用户的信息。如果用户使用禁止的词,则聊天并踢用户。该工具使用PERL正则表达式引擎。
说我被禁止的单词是" bag"的流行衍生词。或"挖掘机"。我可以使用以下正则表达式来匹配包含这些单词的聊天行。
(?i)(digg|bag)(?-i)
我的实际列表中还有其他字样。
但是,我想首先提出一个警告,在聊天中显示为:
所有者:不要说"挖掘机"
所以我尝试使用负面的lookbehind来避免匹配我的禁止单词列表,当它前面是"所有者:" - 但是,如果我在":"之间指定我使用的确切文本,我只能让它工作。和被禁止的词 - 我不会经常这样做,并经常意外地匹配我自己。
我试图使用:
(?<!Owner\:)/s*(?i)(digg|bag)(?-i)
如果只有空格,那就有效,但我真正想要的是不匹配:
者:挖掘机
所有者:Digger
所有者:不要使用行李作为侮辱
所有者:(此处其他任何东西)挖掘
等等,但匹配:
(其他任何事情):(任何被禁止的词,无论结肠后面是什么)
如果我想要的东西在这种语法中是可能的,我无法解决,因为零宽度断言(我无法绕过头),或者如果我的正则表达式只是弱。
我已经尝试了几个教程,并使用了regex101解析器,但我无法得到我想要的东西。你能帮忙吗?
答案 0 :(得分:3)
似乎你只是想要:
/^(?!Owner:).*(?i:(digg|bag))/s
匹配不以所有者开头的邮件:并包含(不区分大小写)digg或bag。
答案 1 :(得分: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
答案 2 :(得分:2)
Owner\:\s*.*?(digg|bag)(*SKIP)(*F)|(digg|bag)
当(*SKIP)(*F)
出现时,您可以使用Owner
失败。请参阅演示。