Skip to content

模式匹配

用于匹配目录、文件,而不是字符串,类似与正则表达式,但他们有不同的语法、用途。例如,列出目录 src 下的所有目录、文件:

shell
li src/**

1 语法

glob 默认不匹配隐藏文件(以点.开头的文件或目录)

1.1 基础语法

通配符描述示例匹配不匹配
*匹配0个或多个字符,包含空串Law*Law, LawsLawerLa, aw
?匹配1个字符?atcat, batat
[abc]匹配括号内字符集合中的单个字符[cb]atcat, batat, bcat
[a-z]匹配括号内字符范围中的单个字符[a-z]ataat, bat, zatat, bcat, Bat
[^abc][!abc]匹配非括号内字符集合中的单个字符[!CB]atcat, batCat, Bat
[^a-z][!a-z]匹配非括号内字符范围中的单个字符[!A-Z]ataat, bat, zatAat, Bat, Zat

在 bash 命令行中[!abc]需要转义成[!abc]

1.2 扩展语法

主要包含三种:

  • Brace Expansion
  • globstar
  • extglob
通配符描述示例匹配不匹配
{x, y, ...}Brace Expansion,展开花括号内容,支持展开嵌套括号a.{png,jp{,e}g}a.png, a.jpg, a.jpeg
**globstar,匹配所有文件和任意层目录,如果**后面紧接着/则只匹配目录,不含隐藏目录src/**src/a.js, src/b/a.js, src/b/src/.hide/a.js
?(pattern-list)匹配0次或1次给定的模式`a.?(txtbin)`a., a.txt, a.bin
*(pattern-list)匹配0次或多次给定的模式`a.*(txtbin)`a., a.txt, a.bin, a.txtbin
+(pattern-list)匹配1次或多次给定的模式`a.+(txtbin)`a.txt, a.bin, a.txtbin
@(pattern-list)匹配给定的模式`a.@(txtbin)`a.txt, a.bin
!(pattern-list)匹配非给定的模式`a.!(txtbin)`a., a.txtbin

pattern-list 是一组以|作为分隔符的模式集合,例如abc|a?c|ac*

2 与正则表达式的差异

*? 在正则表达式中是量词,表示匹配的字符或表达式的数量,与其前一个表达式组合使用。在glob 中表示字符,可以单独使用。

通配符glob正则表达式
*匹配0个或多个字符匹配前一个表达式 0 次或多次。等价于
?匹配1个字符匹配前面一个表达式 0 次或者 1 次。等价于

相关库

minimatch

glob