如果前瞻匹配,正则表达式不返回匹配项

时间:2014-04-02 14:19:24

标签: ruby regex

我试图使用正则表达式找到UNIX样式路径的子路径,我采用三个参数:

  • root要比较的目录。
  • minDepth所需的最低级别。
  • maxDepth要匹配的最高级别数量。

我创建了以下函数(@items在别处定义):

module Navigation
  def dig (root = nil, minDepth = 1, maxDepth = nil)
    root ||= "/"
    @items.select{ |i| !(i.path =~ %r{"\A#{root}(.*?/){#{minDepth},#{maxDepth}}"}).nil? }
  end
end

我的问题是让正则表达式服从maxDepth,目前正则表达式找到一个匹配项,即使路径中有更多级别它没有包含在匹配中。例如:

路径/foo/bar/daz/bag/cop/fig/leg与正则表达式%r{\A/foo(.*?/){1,3}}匹配,但只有/foo/bar/daz/匹配。如果匹配后的任何一点有正斜杠,我如何修改我的正则表达式不匹配?

这样:/foo/bar/daz/hey会匹配,但/foo/bar/daz/hey/不会。

我试图使用否定前瞻但不是很成功,很可能我没有正确使用它们。

1 个答案:

答案 0 :(得分:1)

这可行吗?

\A/foo(/[^/]*?){1,3}\Z


module Navigation
  def dig (root = nil, minDepth = 1, maxDepth = nil)
    root ||= "/"
    @items.select{ |i| !(i.path =~ %r{"\A#{root}(/[^/]*?){#{minDepth},#{maxDepth}}\Z"}).nil? }
  end
end