【问题标题】:How to use a regular expression (glob) to search a file tree如何使用正则表达式 (glob) 搜索文件树
【发布时间】: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。

标签: regex search tree glob


【解决方案1】:

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

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

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

【讨论】:

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