#regex #regular #expression #re

无 std safe-regex

安全的正则表达式库

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 2021 年 2 月 27 日

#16 in 解析工具

Download history 6571/week @ 2024-04-25 6411/week @ 2024-05-02 6057/week @ 2024-05-09 7022/week @ 2024-05-16 5377/week @ 2024-05-23 5820/week @ 2024-05-30 6021/week @ 2024-06-06 5870/week @ 2024-06-13 7108/week @ 2024-06-20 6549/week @ 2024-06-27 6182/week @ 2024-07-04 6460/week @ 2024-07-11 6734/week @ 2024-07-18 6394/week @ 2024-07-25 6698/week @ 2024-08-01 5678/week @ 2024-08-08

26,794 每月下载量
用于 31 个 crate (10 直接)

Apache-2.0

56KB
564

crates.io version license: Apache 2.0 unsafe forbidden pipeline status

一个安全的正则表达式库。

特性

  • 禁止(不安全代码)
  • 良好的测试覆盖率 (~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 上测量的相对运行时间。

    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.rstests/nfa_without_capturing.rs 中。
  • 一旦 const generics 稳定,使用该功能简化一些类型。
  • 一旦 trait bounds on const fn parameters 稳定,将 MatcherN::new 函数设置为 const

开发

许可:Apache-2.0

依赖关系

~315KB