#glob-pattern #pattern-matching #regex #pattern #glob #fnmatch

fnmatch-regex

将 glob 风格的模式转换为正则表达式

2 个不稳定版本

0.2.0 2022年6月11日
0.1.0 2021年6月22日

#699编码

Download history 574/week @ 2024-04-21 362/week @ 2024-04-28 448/week @ 2024-05-05 751/week @ 2024-05-12 824/week @ 2024-05-19 634/week @ 2024-05-26 891/week @ 2024-06-02 651/week @ 2024-06-09 654/week @ 2024-06-16 526/week @ 2024-06-23 639/week @ 2024-06-30 775/week @ 2024-07-07 414/week @ 2024-07-14 590/week @ 2024-07-21 595/week @ 2024-07-28 648/week @ 2024-08-04

2,295 每月下载量
用于 4 个crate(3个直接使用)

BSD-2-Clause

38KB
661

fnmatch-regex - 构建匹配 glob 风格模式的正则表达式

该crate目前提供了一个函数,glob_to_regex,它将具有一些shell扩展的 glob 风格模式转换为正则表达式。注意,它仅处理文本模式匹配,没有尝试验证或构造任何文件系统路径。

当前支持的 glob 风格模式功能包括

  • 任何字符(除 ?*[\{ 外)匹配字面字符

  • ? 匹配任何单个字符(除斜杠 / 外)

  • * 匹配任何零个或多个字符的序列(不含斜杠 /

  • 反斜杠允许下一个字符匹配字面字符,但不能匹配 \a\b\e\n\r\v 序列

  • [...] 字符类支持范围、否定(如果第一个字符是 !)、反斜杠转义,以及如果它是第一个字符后可能跟随 ! 的字符时匹配 ] 字符(例如,[]] 只会匹配单个 ] 字符)

  • {a,bbb,cc} 替代表示支持反斜杠转义,但尚不支持嵌套替换或字符类

注意,通配符模式 *? 以及字符类永远不会匹配斜杠。

示例

  • abc.txt 将仅匹配 abc.txt

  • foo/test?.txt 将匹配例如 foo/test1.txtfoo/test".txt,但不能匹配 foo/test/.txt

  • /etc/c[--9].conf 将匹配例如 /etc/c-.conf/etc/c..conf/etc/7.conf,但不能匹配 /etc/c/.conf

  • linux-[0-9]*-{generic,aws} 将匹配 linux-5.2.27b1-genericlinux-4.0.12-aws,但不能匹配 linux-unsigned-5.2.27b1-generic

请注意,字符类取反修饰符是 !,而不是 ^

let re_name = fnmatch_regex::glob_to_regex("linux-[0-9]*-{generic,aws}")?;
for name in &[
    "linux-5.2.27b1-generic",
    "linux-4.0.12-aws",
    "linux-unsigned-5.2.27b1-generic"
] {
    let okay = re_name.is_match(name);
    println!(
        "{}: {}",
        name,
        match okay { true => "yes", false => "no" },
    );
    assert!(okay == !name.contains("unsigned"));
}

依赖关系

约 2.6–3.5MB
约 63K SLoC