我在使用负向后视正则表达式时遇到问题。我已经阅读了 stackoverflow 的结果,但恐怕我不太理解它们。
我经营着一个游戏服务器,我有一个工具可以读取用户的聊天记录,如果用户使用了禁用词就会将其踢出。该工具使用 PERL 正则表达式引擎。
假设我的禁用词是“bag”或“digger”的流行派生词。我可以使用以下正则表达式来匹配包含这些词的聊天行。
(?i)(digg|bag)(?-i)
我的实际列表中还有其他词。
但是,我想先提供一个警告,它在聊天中显示为:
Owner: Don't say "digger"
所以我尝试使用负面回顾来避免匹配我的禁用词列表,当它前面是“所有者:”时 - 但是,我只能在我指定我在“:”之间使用的确切文本时才能让它工作和禁用词 - 我并不总是这样做,而且经常不小心匹配到我自己。
我试过使用:
(?<!Owner\:)/s*(?i)(digg|bag)(?-i)
如果只有空格,这会起作用,但我真正想要的是不匹配:
Owner:digger
Owner: Digger
Owner: don't use bag as an insult
Owner:(anything else here)dig
等等,但匹配:
(anything else):(any banned word regardless of what precedes it after the colon)
由于零宽度断言(我无法理解),或者我的 regex-fu 功能很弱,我无法确定在这种语法中是否可以实现我想要的东西。
我已经尝试了几个教程,并使用了 regex101 解析器,但我不能完全得到我想要的。你能帮忙吗?
最佳答案
看起来你只是想要:
/^(?!Owner:).*(?i:(digg|bag))/s
匹配不以 Owner: 开头且包含(不区分大小写)digg 或 bag 的消息。
关于regex - 中间带有可变字符的负向后视正则表达式 (PERL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35528601/