regex - 中间带有可变字符的负向后视正则表达式 (PERL)

标签 regex perl negative-lookbehind

我在使用负向后视正则表达式时遇到问题。我已经阅读了 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/

相关文章:

perl - 在 perl 中 ||= 是什么?

perl - 如何使用 DBD::CSV 获取列名行?

regex - 这种负面回顾是如何运作的?

javascript - 是否省略非捕获组? : have a negative effect on RegExp.原型(prototype).测试()?

python - 将两个正则表达式 - lambda 函数合并为一个

regex - mysql 查询的 where 子句中的正则表达式或替换函数

perl - 使用 perl 编写的 gui 应用程序的身份验证

regex - Geany 中的正则表达式搜索中是否可能出现负向后查找?

regex - 无法使具有负向先行的正则表达式修复 JSON 中的未转义引号

javascript - 在正则表达式中应用最大和最小限制