如果附近没有其他文本 block ,我会尝试匹配一些文本。例如,如果 "foo"
不在它之前,我想匹配 "bar"
。我可以匹配 "bar"
如果 "foo"
没有立即在此正则表达式中使用负向后视:
/(?<!foo)bar/
但我也喜欢不匹配 "foo 12345 bar"
。我试过:
/(?<!foo.{1,10})bar/
但使用通配符 + 范围似乎是 Ruby 中的无效正则表达式。我是不是想错了问题?
最佳答案
您的思考方式是正确的。但不幸的是,lookbehinds 通常是固定长度的。唯一的主要异常(exception)是 .NET 的正则表达式引擎,它允许在 lookbehind 中使用重复量词。但是因为你只需要消极的回顾而不是展望。有一个黑客给你。反转字符串,然后尝试匹配:
/rab(?!.{0,10}oof)/
然后反转匹配的结果或从字符串的长度中减去匹配的位置,如果那是你想要的。
现在从您提供的正则表达式来看,我想这只是您实际需要的简化版本。当然,如果 bar
本身是一个复杂的模式,则需要更多思考如何正确反转它。
请注意,如果您的模式同时需要可变长度的回顾和回顾,您将很难解决这个问题。此外,在您的情况下,可以将您的后视解构为多个可变长度的后视(因为您既不使用 +
也不使用 *
):
/(?<!foo)(?<!foo.)(?<!foo.{2})(?<!foo.{3})(?<!foo.{4})(?<!foo.{5})(?<!foo.{6})(?<!foo.{7})(?<!foo.{8})(?<!foo.{9})(?<!foo.{10})bar/
但这并不是那么好,是吗?
关于ruby - 带有通配符的正则表达式否定回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13651640/