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

fnmatch-regex2

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

1 个不稳定版本

0.3.0 2023年12月21日

#1235编码

Download history 5/week @ 2024-04-25 3/week @ 2024-05-02 62/week @ 2024-05-16 139/week @ 2024-05-23 31/week @ 2024-05-30 19/week @ 2024-06-06 50/week @ 2024-06-13 36/week @ 2024-06-20 20/week @ 2024-06-27 16/week @ 2024-07-04 17/week @ 2024-07-11 14/week @ 2024-07-18 445/week @ 2024-07-25

493 次每月下载
用于 pks

BSD-2-Clause

39KB
673

fnmatch-regex2 - 构建匹配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_regex2::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.5–3.5MB
约62K SLoC