了解 glob 模式匹配
5月 18, 2024
注意:此文章已超过 1 年未更新,部分信息可能已经过时。
在 Visual Studio Code(VSCode)以及许多其他工具和库中,文件路径匹配通常使用 glob 模式。
Glob 模式中的通配符#
*:匹配任意数量的字符(不包括路径分隔符/)。**:匹配任意数量的目录层级,包括子目录。?:匹配单个字符。[abc]:匹配方括号内的任意一个字符。{a,b}:匹配花括号内的任意一个模式。
| Wildcard | Description | Example | Matches | Does not match |
|---|---|---|---|---|
* | matches any number of any characters including none | Law* | Law, Laws, or Lawyer | GrokLaw, La, or aw |
*Law* | Law, GrokLaw, or Lawyer. | La, or aw | ||
? | matches any single character | ?at | Cat, cat, Bat or bat | at |
[abc] | matches one character given in the bracket | [CB]at | Cat or Bat | cat, bat or CBat |
[a-z] | matches one character from the (locale-dependent) range given in the bracket | Letter[0-9] | Letter0, Letter1, Letter2 up to Letter9 | Letters, Letter or Letter10 |
示例解释#
**/*.log:**:匹配任意数量的目录层级。*.log:匹配所有以.log结尾的文件。
这个模式将匹配项目目录中的所有
.log文件,无论它们位于哪个子目录中。node_modules:- 这个模式将直接匹配项目根目录下的
node_modules文件夹。
- 这个模式将直接匹配项目根目录下的
**/dist/**:- 第一个
**:匹配任意数量的目录层级。 dist:匹配名称为dist的文件夹。- 第二个
**:匹配dist文件夹中的任意数量的目录层级和文件。
这个模式将匹配项目目录中任意位置的
dist文件夹及其所有子目录和文件。- 第一个
具体示例#
假设你的项目目录结构如下:
my-project/
├── src/
│ ├── index.js
│ └── utils.js
├── logs/
│ ├── app.log
│ └── error.log
├── node_modules/
│ └── ...
├── dist/
│ ├── bundle.js
│ └── assets/
│ └── image.png
└── README.md**/*.log将匹配logs/app.log和logs/error.log。node_modules将匹配node_modules/文件夹。**/dist/**将匹配dist/文件夹及其所有内容,包括dist/bundle.js和dist/assets/image.png。
在 .gitignore 中使用 glob#
没错在 .gitignore 也同样遵循 glob 模式匹配。
基本的 Glob 模式#
*:匹配零个或多个字符,但不匹配路径分隔符(/)。- 示例:
*.log匹配所有以.log结尾的文件,如error.log、access.log。
- 示例:
?:匹配单个字符。- 示例:
file?.txt匹配file1.txt、fileA.txt,但不匹配file12.txt。
- 示例:
[...]:匹配方括号内的任意一个字符。- 示例:
file[0-9].txt匹配file0.txt到file9.txt。
- 示例:
**:匹配零个或多个目录及其子目录。- 示例:
src/**匹配src/目录及其所有子目录和文件。
- 示例:
特殊模式#
/:用于分隔目录路径。- 示例:
/build/匹配根目录下的build目录,但不匹配subdir/build/。
- 示例:
!:用于否定模式,表示不忽略匹配的文件或目录。- 示例:
!important.log表示即使其他规则忽略了.log文件,也不忽略important.log。
- 示例:
#:用于注释行。- 示例:
# 这是一个注释。
- 示例:
/:用于指示从项目的根目录开始匹配。- 示例:
/foo只匹配项目根目录下的foo文件或目录。
- 示例:
Glob 和正则匹配不一样吗?#
Glob 模式和正则表达式都是用于模式匹配的工具,但它们有不同的语法和应用场景。Glob 主要用于文件名匹配,而正则表达式则更为通用,适用于字符串匹配。两者各有优缺点,选择使用哪种模式取决于具体需求。
总结#
- glob 模式和正则表达式的区别:
- glob 模式主要用于文件名匹配,使用简单的通配符如
*和?。 - 正则表达式用于更复杂的字符串匹配,具有更强的表达能力和灵活性。
- glob 模式主要用于文件名匹配,使用简单的通配符如
- 应用场景:
- glob 模式常用于文件系统操作,如查找特定类型的文件。
- 正则表达式广泛应用于文本处理、数据验证和搜索替换等。
- 优缺点:
- glob 模式简单易用,但功能有限。
- 正则表达式功能强大,但语法复杂,学习曲线较陡。