3 个不稳定版本

0.2.1 2023 年 2 月 7 日
0.2.0 2023 年 1 月 22 日
0.1.0 2023 年 1 月 16 日

134文件系统

Download history 3479/week @ 2024-03-14 3895/week @ 2024-03-21 3239/week @ 2024-03-28 3929/week @ 2024-04-04 3451/week @ 2024-04-11 2555/week @ 2024-04-18 3788/week @ 2024-04-25 5756/week @ 2024-05-02 5083/week @ 2024-05-09 6486/week @ 2024-05-16 6296/week @ 2024-05-23 7130/week @ 2024-05-30 5210/week @ 2024-06-06 5207/week @ 2024-06-13 5357/week @ 2024-06-20 4241/week @ 2024-06-27

21,014 每月下载量
41 Crates 中使用(24 个直接使用)

MIT 许可证

87KB
2K SLoC

glob-match

一个极快的 glob 匹配库,支持通配符、字符类和花括号展开。

  • 线性时间匹配。无指数回溯。
  • 零分配。
  • 无正则表达式编译。匹配发生在 glob 模式上。
  • 支持捕获通配符匹配的范围。
  • 基于 Bash 和 micromatch 的数千个测试。

示例

use glob_match::glob_match;

assert!(glob_match("some/**/{a,b,c}/**/needle.txt", "some/path/a/to/the/needle.txt"));

通配符值也可以使用 glob_match_with_captures 函数捕获。这返回一个包含路径字符串中匹配 glob 模式动态部分的范围的 Vec。您可以使用这些范围从原始路径字符串中获取切片。

use glob_match::glob_match_with_captures;

let glob = "some/**/{a,b,c}/**/needle.txt";
let path = "some/path/a/to/the/needle.txt";
let result = glob_match_with_captures(glob, path)
  .map(|v| v.into_iter().map(|capture| &path[capture]).collect());

assert_eq!(result, vec!["path", "a", "to/the"]);

语法

语法 含义
? 匹配任何单个字符。
* 匹配零个或多个字符,除了路径分隔符(例如 /)。
** 匹配零个或多个字符,包括路径分隔符。必须匹配完整的路径段(即后跟一个 / 或模式的末尾)。
[ab] 匹配括号中包含的任意字符。也支持字符范围,例如 [a-z]。使用 [!ab][^ab] 匹配括号中不包含的任何字符。
{a,b} 匹配花括号中包含的任意模式。子模式中可以使用任何通配符字符。花括号可以嵌套多达 10 层。
! 当在 glob 的开头时,这将否定结果。多个 ! 字符将多次否定 glob。
\ 可以使用反斜杠字符来转义上述所有特殊字符。

基准测试

globset                 time:   [35.176 µs 35.200 µs 35.235 µs]
glob                    time:   [339.77 ns 339.94 ns 340.13 ns]
glob_match              time:   [179.76 ns 179.96 ns 180.27 ns]

模糊测试

您可以使用 glob-match 本身进行模糊测试,命令为 cargo fuzz。有关设置和安装的指南,请参阅Rust Fuzz 书籍。按照 Rust Fuzz 书籍中的说明来配置和运行模糊测试步骤。

在发现工件后,使用 cargo fuzz fmt [target] [artifact-path] 来获取原始输入。

$ cargo fuzz fmt both_fuzz fuzz/artifacts/both_fuzz/slow-unit-LONG_HASH
Output of `std::fmt::Debug`:

Data {
    pat: "some pattern",
    input: "some input",
}

无运行时依赖