3 个不稳定版本
0.2.1 | 2023 年 2 月 7 日 |
---|---|
0.2.0 | 2023 年 1 月 22 日 |
0.1.0 | 2023 年 1 月 16 日 |
134 在 文件系统
21,014 每月下载量
在 41 个 Crates 中使用(24 个直接使用)
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",
}