6个版本 (3个重大变更)
新 0.4.0 | 2024年8月20日 |
---|---|
0.3.3 | 2024年8月15日 |
0.3.2 | 2024年7月11日 |
0.2.0 | 2024年5月30日 |
0.1.0 | 2024年5月27日 |
#384 在 文件系统
1,417 每月下载量
在 13 个Crates中使用 (通过 rspack_plugin_javascript)
19KB
292 行
fast-glob
介绍
基于 devongovett/glob-match
的Rust性能高效的glob匹配库。
关键特性
- 最高60%的性能提升。
- 支持更全面和完善的特性。
示例
use fast_glob::glob_match;
let glob = "some/**/n*d[k-m]e?txt";
let path = "some/a/bigger/path/to/the/crazy/needle.txt";
assert!(glob_match(glob, path));
语法
语法 | 意义 |
---|---|
? |
匹配任意单个字符。 |
* |
匹配零个或多个字符,但不能是路径分隔符(例如 / )。 |
** |
匹配零个或多个字符,包括路径分隔符。必须匹配完整的路径段(即后面跟一个 / 或模式的结尾)。 |
[ab] |
匹配括号内的任意一个字符。也支持字符范围,例如 [a-z] 。使用 [!ab] 或 [^ab] 匹配括号内 以外的 任意字符。 |
{a,b} |
匹配花括号内的任意一个模式。子模式中可以使用任意通配符。花括号可以嵌套最多10层。 |
! |
当在glob的开始处,这会否定结果。多个 ! 字符可以多次否定glob。 |
\ |
可以使用反斜杠字符来转义上述任何特殊字符。 |
基准测试
测试用例1
const GLOB: &'static str = "some/**/n*d[k-m]e?txt";
const PATH: &'static str = "some/a/bigger/path/to/the/crazy/needle.txt";
mine time: [83.742 ns 84.400 ns 85.132 ns]
glob time: [386.77 ns 396.19 ns 406.87 ns]
globset time: [21.010 µs 21.114 µs 21.225 µs]
glob_match time: [195.58 ns 196.80 ns 198.24 ns]
glob_pre_compiled time: [88.180 ns 90.274 ns 92.158 ns]
globset_pre_compiled time: [42.680 ns 42.778 ns 42.911 ns]
测试用例2
const GLOB: &'static str = "some/**/{tob,crazy}/?*.{png,txt}";
const PATH: &'static str = "some/a/bigger/path/to/the/crazy/needle.txt";
mine time: [309.80 ns 311.56 ns 313.25 ns]
globset time: [31.456 µs 31.502 µs 31.559 µs]
glob_match time: [384.21 ns 384.71 ns 385.15 ns]
globset_pre_compiled time: [42.505 ns 42.526 ns 42.551 ns]
常见问题解答
为什么不用更高效的 glob_match
进行花括号扩展?
glob_match
无法处理复杂的花括号扩展。以下是一些失败的示例
glob_match("{a/b,a/b/c}/c", "a/b/c")
glob_match("**/foo{bar,b*z}", "foobuzz")
glob_match("**/{a,b}/c.png", "some/a/b/c.png")
由于这些限制,花括号展开
需要不同的实现,以处理这种模式的复杂性,从而产生一些性能权衡。
致谢
- 由@devongovett创建的glob-match项目,这是一个在Rust中非常快速的glob匹配库。