如何使用正则表达式 (glob) 搜索文件树

Posted

技术标签:

【中文标题】如何使用正则表达式 (glob) 搜索文件树【英文标题】:How to use a regular expression (glob) to search a file tree 【发布时间】:2010-10-09 21:26:17 【问题描述】:

如何调整搜索树以处理有限的正则表达式?

给定一个文件名,我需要找到与该文件名匹配的所有节点。节点可能包含通常的文件名 glob(* 和?)。由于这是一棵搜索树,因此速度至关重要。

我应该补充一点,速度最重要的情况是排除匹配的平均时间。在大多数情况下,匹配会失败。

如果树包含以下节点:

foo, bar, foo*, *bar, foo?bar 
搜索“foo”将返回节点 1 和 3。 搜索“bar”将返回节点 2 和 4。 搜索“fob”不会返回任何节点。 搜索“fooxbar”将返回节点 5。 搜索“foobar”将返回节点 3 和 4。

【问题讨论】:

这是(正则表达式的)反向问题:匹配字符串是否属于正则语言? 你能给我们一个样本 i/o 吗? 一个例子:假设树包含以下节点:foo, bar, foo*, *bar, foo?bar 给定任何字符串(例如 foo, foobar, fooxbar, fob 等),快速找到与该字符串匹配的节点(如果有)。 您应该将示例添加到问题中,而不是评论中。此外,尽可能清晰有助于回答者。 我已经使用了一些实现来做到这一点,基于 AC 和 DFA 和 NFA。 【参考方案1】:

Aho-Corasick 搜索树可以满足要求。 “Tries”是一篇关于这类事情的非常好的文章,以及 Evolution 中用于替换正则表达式搜索的 Etrie 实现。

要进行整个字符串匹配,您可以添加开始和结束锚状态。如果扫描多行数据,您可以在开头和结尾添加换行符。您还可以删除为部分匹配添加交叉链接的部分,以开始不同的匹配。这也允许更快的排除。

另一种检查字符串集中成员资格的算法是CritBit。这没有正则表达式,但它很简单并且可以测试完整的字符串。

【讨论】:

这看起来很有希望,尽管我想匹配整个输入字符串,而不是其中的子字符串。我会阅读链接并确认它符合要求。 您可以添加一个新的前线锚,或者如果扫描多行干草堆并将行结束添加到针的前面。例如“\n搜索字符串”。

以上是关于如何使用正则表达式 (glob) 搜索文件树的主要内容,如果未能解决你的问题,请参考以下文章

从 glob 表达式创建正则表达式

perl模糊匹配文件名

在 Python 脚本中使用正则表达式 [重复]

glob通配符

找出两个 Glob 模式(或正则表达式)的匹配项是不是相交的算法

如何在 linux shell 脚本中使用正则表达式搜索文件 [关闭]