了解 glob 模式匹配 ByAI
5月 18, 2024
在 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 模式简单易用,但功能有限。
- 正则表达式功能强大,但语法复杂,学习曲线较陡。