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"
功能
限制
-
仅在字节切片上工作,不支持字符串。
-
部分优化。运行时间大约是
regex
crate 的 10 倍。以下是使用safe-regex-rs/bench
在 2018 Macbook Pro 上测量的相对运行时间。regex
safe_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 fn
parameters 稳定,将MatcherN::new
函数设置为const
。
开发
许可:Apache-2.0
依赖关系
~315KB