#regex #expression #scratch #flags #stream #vectorscan #chimera

无需 std vectorscan-async

为 vectorscan C++ 正则表达式库提供的包装器

3 个版本

0.0.2 2024年1月1日
0.0.1 2024年1月1日
0.0.0 2023年12月30日

270 位于 内存管理

BSD-3-Clause

465KB
5K SLoC

vectorscan

A Rust 对 vectorscan C++ 正则表达式库的包装。

特性

vectorcan^vectorscan 库(最初为 hyperscan^hyperscan,来自英特尔)支持使用 PCRE 语法子集进行高性能模式匹配。它最初是为极低延迟的网络流量监控而编写的,因此它有一些可能不熟悉的接口特性。

  • Vectorcan 回调 API:当 vectorscan 执行用户提供的 C ABI 方法调用时,将“返回”匹配给用户,因此与匹配引擎的重叠匹配和其他交互式反馈比同步方法调用更容易支持。
  • 高度表达的模式集匹配: expression::ExpressionSet 支持单个 expression::Expression 实例可用的所有搜索和匹配操作。这是罕见的:大多数其他正则表达式引擎,例如,不支持找到匹配偏移量,而是仅支持集合中哪些表达式匹配。
  • 可变状态和字符串搜索: Vectorscan 要求用户明确为每个搜索方法提供“刮擦”空间 state::Scratch。此状态并不很大,但大多数其他正则表达式引擎试图提供一个没有任何可变状态的接口,即使它们在内部使用像懒惰 DFA 这样的结构。

功能标志

此库使用 spack-rs 通过 spack 配置 vectorscan 代码库的构建,以便它可以精确地指定它带来的本地依赖项。

  • "static" (默认): 静态链接到 vectorscan。与 "dynamic" 冲突。
  • "dynamic": 动态链接到 vectorscan。与 "static""chimera""alloc" 冲突。由于 spack 的缓存和 RPATH 重写,相同的动态库可以由此 crate 的每个依赖共享。
  • "compiler" (默认): 是否引入整个 libhs 库,或者只引入 libhs_runtime,后者无法编译模式但可以反序列化它们。这显著减少了添加到二进制文件的代码大小。
  • "chimera": 是否链接到 PCRE 并添加额外的 vectorscan 代码以提供与 chimera PCRE 兼容的搜索库。与 "dynamic" 冲突,并且需要 "compiler"

特性标志还用于在不使用时限制某些功能,以最小化外部依赖

  • "alloc": 使用 crate::alloc 将挂钩到 vectorscan 的动态内存分配。由于修改进程全局钩子,需要 "static"
  • "stream" (默认): 支持使用 crate::stream 进行流解析。
  • "vectored" (默认): 支持使用 Mode::VECTORED 进行向量模式解析。
  • "catch-unwind" (默认): 在匹配回调将未定义行为传播回 vectorscan 之前,捕获 Rust 的 panic。
  • "async": 使用 tokio 提供基于 vectorscan 的独特回调 API 的 async 接口。
  • "tokio-impls":tokio::io::AsyncWrite实现了流解析器crate::stream::channel::AsyncStreamWriter

许可证

BSD-3-Clause,以匹配上游的vectorscan项目。

依赖关系

~5–16MB
~188K SLoC