使用正则表达式组捕获查找文件名

时间:2014-01-20 22:19:58

标签: ruby regex file glob regex-group

我可以通过regexp找到匹配的文件,并且还支持regexp中的组。像:

match_files('/home/(*)/**/(*).txt')

会返回类似的内容:

[ ['/home/bob/docs/abc.txt', 'bob', 'abc'], ['/home/sue/archive/docs/def.txt', 'sue', 'def'] ]

Guard会做这样的事情。我不打算匹配这个特定的正则表达式;而是匹配任何可能提供的任意正则表达式输入。

Dir.glob()通常返回一个平面数组,不支持组。我正试图找到一个库或一些技术来支持这种事情,对于DSL来说。

2 个答案:

答案 0 :(得分:0)

  

我正在尝试找到一个支持这种事情的库或技巧,用于DSL。

所以你的问题似乎不合时宜,因为你要求推荐或找到一个工具或库来解决你的问题。

此外,您的问题应包括有效的代码示例:

['/home/bob/docs/abc.txt', 'bob', 'readme']

我猜它应该是

['/home/bob/docs/abc.txt', 'bob', 'abc']

无论如何......我认为这个问题非常有趣,但我认为你不能用标准库来解决它。

Dir.glob:

  

如果path与pattern匹配,则返回true。模式不是   正则表达式;相反,它遵循类似于shell文件名的规则   通配符。它可能包含以下元字符...

唯一合理的做法是允许特殊字符,解析字符串,提取匹配项,创建一个glob,然后将匹配应用于文件名。

答案 1 :(得分:0)

这个怎么样。

regex = %r{/home/([^/]+)/.*/([^/]+).txt}
`find .`.split.grep(regex).map { |l| l.match(regex) }.map(&:to_a)

当然可以改进。