如何使用正则表达式 (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) 搜索文件树的主要内容,如果未能解决你的问题,请参考以下文章