7 个版本
| 0.3.0 | 2024 年 4 月 15 日 |
|---|---|
| 0.2.6 | 2024 年 4 月 1 日 |
| 0.2.5 | 2022 年 2 月 10 日 |
| 0.2.4 | 2021 年 5 月 15 日 |
| 0.1.1 |
|
#16 in 解析工具
26,794 每月下载量
用于 31 个 crate (10 直接)
56KB
564 行
一个安全的正则表达式库。
特性
禁止(不安全代码)- 良好的测试覆盖率 (~80%)
- 运行时是线性的。
- 内存使用是恒定的。不进行分配。
- 将您的正则表达式编译为简单的 Rust 函数
- Rust 编译器检查并优化匹配器
- 支持基本的正则表达式语法
- 任何字节:
. - 序列:
abc - 类:
[-ab0-9],[^ab] - 重复:
a?,a*,a+,a{1},a{,1},a{,1},a{1,2},a{,} - 选择:
a|b|c - 捕获组:
a(bc)? - 非捕获组:
a(?:bc)?
- 任何字节:
no_std,通过省略默认的"std"功能
限制
-
仅在字节切片上工作,不支持字符串。
-
部分优化。运行时间大约是
regexcrate 的 10 倍。以下是使用safe-regex-rs/bench在 2018 Macbook Pro 上测量的相对运行时间。regexsafe_regex表达式 1 6 查找电话号码 .*([0-9]{3})[-. ]?([0-9]{3})[-. ]?([0-9]{4}).*1 20 查找日期时间 .*([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+).*1 0.75 解析日期时间 ([0-9]+)-([0-9]+)-([0-9]+) ([0-9]+):([0-9]+)1 50 检查 PEM Base64 [a-zA-Z0-9+/]{0,64}=*1 20-500 子串搜索 .*(2G8H81RFNZ).*
替代方案
regex- 成熟且流行
- 由 Rust 语言的核心开发者维护
- 包含
unsafe代码。 - 分配
- 首次使用时在运行时编译正则表达式。
- 后续使用必须从缓存中检索。
pcre2- 使用用不安全的 C 编写的 PCRE 库。
正则表达式- 没有文档
rec
Cargo Geiger 安全报告
Metric output format: x/y
x = unsafe code used by the build
y = total unsafe code found in the crate
Symbols:
🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)]
❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)]
☢️ = `unsafe` usage found
Functions Expressions Impls Traits Methods Dependency
0/0 0/0 0/0 0/0 0/0 🔒 safe-regex 0.3.0
0/0 0/0 0/0 0/0 0/0 🔒 └── safe-regex-macro 0.3.0
0/0 0/0 0/0 0/0 0/0 🔒 ├── safe-proc-macro2 1.0.68
0/0 0/0 0/0 0/0 0/0 🔒 │ └── unicode-xid 0.2.4
0/0 0/0 0/0 0/0 0/0 🔒 └── safe-regex-compiler 0.3.0
0/0 0/0 0/0 0/0 0/0 🔒 ├── safe-proc-macro2 1.0.68
0/0 0/0 0/0 0/0 0/0 🔒 └── safe-quote 1.0.15
0/0 0/0 0/0 0/0 0/0 🔒 └── safe-proc-macro2 1.0.68
0/0 0/0 0/0 0/0 0/0
示例
use safe_regex::{regex, Matcher0};
let matcher: Matcher0<_> =
regex!(br"[ab][0-9]*");
assert!(matcher.is_match(b"a42"));
assert!(!matcher.is_match(b"X"));
use safe_regex::{regex, Matcher3};
let matcher: Matcher3<_> =
regex!(br"([ab])([0-9]*)(suffix)?");
let (prefix, digits, suffix) =
matcher.match_slices(b"a42").unwrap();
assert_eq!(b"a", prefix);
assert_eq!(b"42", digits);
assert_eq!(b"", suffix);
let (prefix_range, digits_r, suffix_r)
= matcher.match_ranges(b"a42").unwrap();
assert_eq!(0..1_usize, prefix_range);
assert_eq!(1..3_usize, digits_r);
assert_eq!(0..0_usize, suffix_r);
变更日志
- v0.3.0 - 添加
assert_match和默认std功能。 - v0.2.6 - 修复
regex!宏调用站点的一些 Clippy 警告。 - v0.2.5 - 修复
no_std。感谢 Soares Chen!github.com/soareschen gitlab.com/soareschen-informal - v0.2.4
- 错误修复,降低性能。
- 优化非匹配运行时间。
- v0.2.3
- 重命名
match_all->match_slices。 - 添加
match_ranges。
- 重命名
- v0.2.2 - 简化
match_all返回类型 - v0.2.1 - 非捕获组,错误修复
- v0.2.0
- 线性时间 & 常数内存算法! :)
- 绕过 rustc 优化器在具有指数执行路径的正则表达式(如 "a{,30}")上挂起的问题。请参阅
src/bin/uncompilable/main.rs。
- v0.1.1 - 错误修复和更多测试。
- v0.1.0 - 首次发布版本
待办事项
- 11+ 捕获组
- 增加覆盖率
- 添加模糊测试
- 常见字符类:空白、字母、标点等。
- 匹配字符串
- 重复捕获组:
(ab|cd)*。想法:返回一个MatcherNIter结构体,该结构体是一个迭代器,返回MatcherN结构体。 - 实现https://swtch.com/%7Ersc/regexp/regexp3.html 中解释的优化。一些代码已经存在于
tests/dfa_single_pass.rs和tests/nfa_without_capturing.rs中。 - 一旦 const generics 稳定,使用该功能简化一些类型。
- 一旦 trait bounds on
const fnparameters 稳定,将MatcherN::new函数设置为const。
开发
许可:Apache-2.0
依赖关系
~315KB