ruby - 带有通配符的正则表达式否定回顾

标签 ruby regex lookbehind

如果附近没有其他文本 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/

相关文章:

regex - 如何在Jmeter中使用正则表达式提取多个值

ios - 检查有效的 vimeo url ios

regex - RegEx可以匹配具有给定路径的所有url,但不能以单词“search”结尾

regex - 可变长度 Lookbehind 在 perl 文件中不起作用,但在单行中起作用

javascript - Firefox Javascript正则表达式获取方括号内但不包括括号的数字数组

ruby-on-rails - 知道@vendor.name 后如何使 Ruby on Rails 中的 URL 对 SEO 友好?

arrays - 将项目添加到具有索引的新数组

ruby-on-rails - Ruby on Rails 中的类访问器和继承

ruby - 使用 Rubyzip 压缩现有文件

javascript - 构建此 JavaScript 正则表达式的困难