【问题标题】:Find filenames with regexp group capture使用正则表达式组捕获查找文件名
【发布时间】:2014-01-20 22:19:57
【问题描述】:

我是通过正则表达式查找匹配文件的方法,并且还支持正则表达式中的组。喜欢:

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

会返回类似:

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

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

Dir.glob() 通常返回一个平面数组并且不支持组。我正在尝试为 DSL 找到支持此类事物的库或某种技术。

【问题讨论】:

  • 那么你有什么尝试?我们需要看看你的尝试。
  • 正如问题所暗示的,我尝试了 Dir.glob(),但结果为空。我尝试查找任何可能执行此操作的库或 API,但找不到。
  • 请求定位库是题外话,但由于这个问题也要求“或一些技术”,我会投票保持开放。
  • mahemoff,我删除了我的答案(给定示例的正则表达式),因为它没有解决您的问题。您可能想知道为什么三个答案中有两个只关注您的示例。我不能代表@Blake,但是当我看到这个例子时,我的大脑进入了正则表达式模式。然后当我看到布莱克的回答时,这成为了问题。所以这是布莱克的错。 :-)
  • 了解@CarySwoveland。抱歉,不清楚。我提到它是针对 DSL 的,但应该让它更明显,这只是一个例子。

标签: ruby regex file glob regex-group


【解决方案1】:

我正在尝试为 DSL 找到支持此类事物的库或技巧。

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

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

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

我猜应该是这个意思

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

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

目录.glob:

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

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

【讨论】:

  • "readme" 是一个错字,已更新。问题是切题的。您引用的摘录要求提供库或“技巧”,这意味着我会接受任何方式来做到这一点。
【解决方案2】:

这个怎么样。

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

当然可以改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2019-03-17
    • 2011-03-03
    • 2018-03-11
    • 1970-01-01
    相关资源
    最近更新 更多