#regex #javascript #regular #expression #engine #syntax #assertions

no-std regress

针对EcmaScript语法的正则表达式引擎

17个版本 (9个破坏性更新)

0.10.0 2024年5月29日
0.9.0 2024年2月26日
0.7.1 2023年8月25日
0.6.0 2023年4月28日
0.1.3 2020年5月26日

#41 in 文本处理

Download history 35328/week @ 2024-05-01 43986/week @ 2024-05-08 87491/week @ 2024-05-15 105230/week @ 2024-05-22 108033/week @ 2024-05-29 114496/week @ 2024-06-05 112417/week @ 2024-06-12 100697/week @ 2024-06-19 116307/week @ 2024-06-26 106049/week @ 2024-07-03 112518/week @ 2024-07-10 116052/week @ 2024-07-17 116872/week @ 2024-07-24 114391/week @ 2024-07-31 133036/week @ 2024-08-07 152115/week @ 2024-08-14

537,989 每月下载量
315 个crate中使用了 (直接使用 210)

MIT/Apache

1.5MB
38K SLoC

regress - 使用EcmaScript语法的Rust REGex

oh no why

简介

regress是一个在Rust中实现的回溯正则表达式引擎,旨在JavaScript正则表达式语法。有关更多信息,请参阅crate文档

它速度快,支持Unicode,依赖项少,测试套件大。它提供的保证比regexcrate少,但提供了更多的语法特性,例如后向引用和前瞻断言。

有趣工具

regress-tool二进制文件可用于一些有趣的功能。

您可以使用dump-phases命令行标志查看编译过程。

> cargo run 'x{3,4}' 'i' --dump-phases

您还可以运行一个小型基准测试,例如

> cargo run --release -- 'abcd' 'i' --bench ~/3200.txt

想要贡献吗?

这是我第一次编写的Rust程序,因此毫无疑问还有改进的空间。

还有很多东西还没有完成,也许你想贡献?

目前缺失的功能

  • 一个用于替换字符串同时替换捕获组的API(例如使用$1
  • 一个用于转义字符串以使其成为字面的API
  • 实现std::str::pattern::Pattern

缺失的性能优化

  • 锚定匹配如^abc仍然执行字符串搜索。我们应该计算整个正则表达式是否锚定,并在锚定时优化匹配。
  • 非贪婪循环如.*?会急切地计算它们的最大匹配。这不会影响正确性,但它们可能会匹配比预期更多的内容。
  • 纯文本搜索应使用Boyer-Moore等。
  • 存在许多向量化机会。

依赖关系

~1.5–2MB
~28K SLoC