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 文本处理
4,731每月下载量
用于 tracexec
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