globset

跨平台单个 glob 和 glob 集合匹配。glob 集合匹配是将一个或多个 glob 模式与单个备选路径同时匹配,并返回所有匹配的 glob 的过程。

Linux build status Windows build status globset - 图3

MIT 或UNLICENSE的双重许可.

文档

https://docs.rs/globset

用法

将此添加到您的Cargo.toml:

  1. [dependencies]
  2. globset = "0.3"

在你的箱根使用:

  1. extern crate globset;

示例:一个 glob

此示例显示如何将单个 glob 与单个文件路径匹配.

  1. use globset::Glob;
  2. let glob = Glob::new("*.rs")?.compile_matcher();
  3. assert!(glob.is_match("foo.rs"));
  4. assert!(glob.is_match("foo/bar.rs"));
  5. assert!(!glob.is_match("Cargo.toml"));

示例:配置 glob 匹配器

此示例显示如何使用 一个GlobBuilder去配置匹配(match)语义。在此示例中,我们不要通配符,匹配路径分隔符。

  1. use globset::GlobBuilder;
  2. let glob = GlobBuilder::new("*.rs")
  3. .literal_separator(true).build()?.compile_matcher();
  4. assert!(glob.is_match("foo.rs"));
  5. assert!(!glob.is_match("foo/bar.rs")); // 不再 matches
  6. assert!(!glob.is_match("Cargo.toml"));

示例:一次匹配多个 globs

此示例显示如何一次匹配多个 glob 模式.

  1. use globset::{Glob, GlobSetBuilder};
  2. let mut builder = GlobSetBuilder::new();
  3. // 一个 GlobBuilder 就可以用来配置每个 glob's match 语义
  4. // 单个.
  5. builder.add(Glob::new("*.rs")?);
  6. builder.add(Glob::new("src/lib.rs")?);
  7. builder.add(Glob::new("src/**/foo.rs")?);
  8. let set = builder.build()?;
  9. assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]);

性能

这个 箱 通过将它们转换为正则表达式,和使用regex箱来执行它们,来实现 globs。

对于单个全局匹配,此箱子的性能应该与glob箱性能大致相当。(*_regex是针对此库的基准,*_glob是针对glob库的基准。) 优化regex箱,还可能推动这个库超过glob基准,特别是匹配较长的路径时。

  1. test ext_glob ... bench: 425 ns/iter (+/- 21)
  2. test ext_regex ... bench: 175 ns/iter (+/- 10)
  3. test long_glob ... bench: 182 ns/iter (+/- 11)
  4. test long_regex ... bench: 173 ns/iter (+/- 10)
  5. test short_glob ... bench: 69 ns/iter (+/- 4)
  6. test short_regex ... bench: 83 ns/iter (+/- 2)

此箱子的主要性能优势是将多个 glob 与单个路径匹配。要用glob箱,一个接一个地匹配每个 glob。在这个箱子里,许多人可以同时匹配。例如:

  1. test many_short_glob ... bench: 1,063 ns/iter (+/- 47)
  2. test many_short_regex_set ... bench: 186 ns/iter (+/- 11)

glob箱比较

  • 支持替代 “或” globs,例如,*.{foo,bar}.
  • 可以正确匹配非 UTF-8 文件路径.
  • 支持一次匹配多个 globs.
  • 不提供匹配文件路径的递归目录迭代器,虽然我相信这个箱子最终应该增长一个。
  • 支持不区分大小写和 require-literal-separator(需要路径分隔符) 匹配选项,但是支持 require-literal-leading-dot((需要前路径点号)) 选项.