#regex #dfa #automata #nfa #search-engine

regex-cursor

能够搜索不连续的搜索区域的regex分支

5个版本

0.1.4 2024年3月15日
0.1.3 2024年1月31日
0.1.2 2024年1月27日
0.1.1 2024年1月25日
0.1.0 2024年1月25日

#128 in 文本处理

Download history 978/week @ 2024-04-23 1029/week @ 2024-04-30 952/week @ 2024-05-07 1264/week @ 2024-05-14 1252/week @ 2024-05-21 1023/week @ 2024-05-28 903/week @ 2024-06-04 868/week @ 2024-06-11 892/week @ 2024-06-18 880/week @ 2024-06-25 848/week @ 2024-07-02 1233/week @ 2024-07-09 1277/week @ 2024-07-16 1112/week @ 2024-07-23 941/week @ 2024-07-30 1065/week @ 2024-08-06

4,731每月下载量
用于 tracexec

MIT/Apache

645KB
7.5K SLoC

regex-cursor

此crate提供用于在[正则表达式](aka "regex")中搜索不连续字符串匹配的程序。它基于[regex-automata],大部分代码都是从regex存储库中的各个crate改编而来。

它旨在作为对“流式正则表达式”上游支持的示例。此crate中基于游标的API与regex/regex-automata已公开的API非常相似。为此,提供了一种通用的Cursor trait,集合可以实施。

以下是一个游标API的草图。字符串以多个字节块的形式产生。调用advance将游标移动到下一个块。调用backtrack将游标移动回一个块。此crate需要回溯。这使得它不适合搜索像通过TCP连接发送的字节流那样的完全未缓冲的流。

pub trait Cursor {
    fn chunk(&self) -> &[u8] { .. }
    fn advance(&mut self) -> bool { .. }
    fn bracktrack(&mut self) -> bool { .. }
}

在处理此crate的过程中,我发现正则表达式回溯的次数比预期的要多,大多数功能本质上都需要回溯。对于不缓存输入的网络用例,主要用例可能是检测匹配(不一定需要匹配的字节范围)。这种用例可以通过从regex-automata crate的混合和DFA引擎手动喂入字节来覆盖。这种方法还有优点,即允许调用者暂停匹配(异步)以等待更多数据,允许调用者驱动搜索而不是引擎本身。

此crate唯一可以应用于完全流式传输的部分是流式PikeVM实现。但是,有一些限制

  • 由于PikeVM可能需要向前查看多个字节以消除替代匹配的歧义,因此只能运行单个搜索
  • 长度超过一个字节的预过滤器无法工作
  • utf-8模式无法支持(可能发生在unicode边界之间的空匹配)

目前,PikeVM实现没有考虑到此用例,可能会不必要地调用回溯,但这可以在未来得到解决,但特别是第一个点非常有限。PikeVM也不允许用户驱动搜索,例如在网络调用上阻塞(没有异步)。

依赖关系

~2.7–4MB
~71K SLoC