globset
跨平台单个 glob 和 glob 集合匹配。glob 集合匹配是将一个或多个 glob 模式与单个备选路径同时匹配,并返回所有匹配的 glob 的过程。
MIT 或UNLICENSE的双重许可.
文档
用法
将此添加到您的Cargo.toml:
[dependencies]globset = "0.3"
在你的箱根使用:
extern crate globset;
示例:一个 glob
此示例显示如何将单个 glob 与单个文件路径匹配.
use globset::Glob;let glob = Glob::new("*.rs")?.compile_matcher();assert!(glob.is_match("foo.rs"));assert!(glob.is_match("foo/bar.rs"));assert!(!glob.is_match("Cargo.toml"));
示例:配置 glob 匹配器
此示例显示如何使用 一个GlobBuilder去配置匹配(match)语义。在此示例中,我们不要通配符,匹配路径分隔符。
use globset::GlobBuilder;let glob = GlobBuilder::new("*.rs").literal_separator(true).build()?.compile_matcher();assert!(glob.is_match("foo.rs"));assert!(!glob.is_match("foo/bar.rs")); // 不再 matchesassert!(!glob.is_match("Cargo.toml"));
示例:一次匹配多个 globs
此示例显示如何一次匹配多个 glob 模式.
use globset::{Glob, GlobSetBuilder};let mut builder = GlobSetBuilder::new();// 一个 GlobBuilder 就可以用来配置每个 glob's match 语义// 单个.builder.add(Glob::new("*.rs")?);builder.add(Glob::new("src/lib.rs")?);builder.add(Glob::new("src/**/foo.rs")?);let set = builder.build()?;assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]);
性能
这个 箱 通过将它们转换为正则表达式,和使用regex箱来执行它们,来实现 globs。
对于单个全局匹配,此箱子的性能应该与glob箱性能大致相当。(*_regex是针对此库的基准,*_glob是针对glob库的基准。)
优化regex箱,还可能推动这个库超过glob基准,特别是匹配较长的路径时。
test ext_glob ... bench: 425 ns/iter (+/- 21)test ext_regex ... bench: 175 ns/iter (+/- 10)test long_glob ... bench: 182 ns/iter (+/- 11)test long_regex ... bench: 173 ns/iter (+/- 10)test short_glob ... bench: 69 ns/iter (+/- 4)test short_regex ... bench: 83 ns/iter (+/- 2)
此箱子的主要性能优势是将多个 glob 与单个路径匹配。要用glob箱,一个接一个地匹配每个 glob。在这个箱子里,许多人可以同时匹配。例如:
test many_short_glob ... bench: 1,063 ns/iter (+/- 47)test many_short_regex_set ... bench: 186 ns/iter (+/- 11)
与glob箱比较
- 支持替代 “或” globs,例如,
*.{foo,bar}. - 可以正确匹配非 UTF-8 文件路径.
- 支持一次匹配多个 globs.
- 不提供匹配文件路径的递归目录迭代器,虽然我相信这个箱子最终应该增长一个。
- 支持不区分大小写和 require-literal-separator(需要路径分隔符) 匹配选项,但是不支持 require-literal-leading-dot((需要前路径点号)) 选项.
