#glob #glob-pattern #pattern #walkdir

fast-glob

为Rust提供的性能高效的glob匹配库

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文件系统

Download history 292/week @ 2024-05-25 38/week @ 2024-06-01 10/week @ 2024-06-08 3/week @ 2024-06-15 334/week @ 2024-07-06 282/week @ 2024-07-13 231/week @ 2024-07-20 426/week @ 2024-07-27 162/week @ 2024-08-03 344/week @ 2024-08-10 453/week @ 2024-08-17

1,417 每月下载量
13 个Crates中使用 (通过 rspack_plugin_javascript)

MIT 许可证

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")

由于这些限制,花括号展开需要不同的实现,以处理这种模式的复杂性,从而产生一些性能权衡。

致谢

无运行时依赖