VSCode全局搜索中“”和“”等通配符仅在files to include/exclude中生效,属glob模式而非正则;主搜索框需启用“.”按钮才支持正则,否则console.log(*)等写法无效。

VSCode全局搜索中通配符实际指 glob 模式,不是正则表达式
很多人一说“通配符”就下意识点 .* 按钮,结果发现 * 和 ? 不起作用——因为那是正则模式,而 VSCode 里真正支持 *、**、? 这类通配符的地方,是「文件范围过滤」栏,不是主搜索框。
简单说:* 和 ** 只在设置搜索路径(files to include/exclude)时生效;主搜索框里写 console.log(*) 是无效的,必须切到正则模式再写 console\.log\([^)]*\)。
-
*匹配当前目录下任意字符(不含/),如src/*.js匹配src/a.js,但不匹配src/lib/b.js -
**跨目录递归匹配,如src/**/test*.ts匹配src/utils/__tests__/helper.test.ts -
?匹配单个任意字符,如file?.log匹配file1.log但不匹配file10.log - 排除规则里加
!表示白名单,如!important.log可让被*.log排除的列表中保留它
如何在「files to include/exclude」里正确使用通配符
点击搜索面板右上角的 … 展开高级过滤栏,填入路径模式。这里才是 glob 通配符真正起效的位置。填错格式会导致整个过滤失效,比如漏掉引号、多加空格、或混用正则语法。
- 只搜源码?填
src/**/*.{js,ts,jsx,tsx}——注意大括号是字面量,不用转义 - 排除所有构建产物?填
**/dist,**/build,**/out(英文逗号分隔,无空格) - 想跳过某类临时文件但保留日志分析?填
**/*.tmp,**/*.cache,!*.log - 工作区配置优先级高于全局,所以
.vscode/settings.json里的search.exclude会覆盖用户设置
为什么 search.exclude 配置里用 **/node_modules 而不是 node_modules
因为 search.exclude 的值是 glob 模式,不是文件名列表。node_modules 只能匹配项目根下的该目录,而真实项目里 node_modules 可能嵌套在 packages/foo/node_modules 或 examples/bar/node_modules 中。只有 **/node_modules 才能递归命中所有层级。
- 错误写法:
"node_modules": true→ 只忽略根目录的node_modules - 正确写法:
"**/node_modules": true→ 忽略所有路径下的同名目录 - 性能影响明显:没加
**/时,VSCode 仍会扫描子目录里的node_modules,导致搜索变慢甚至卡顿 - 同理,
"**/dist"比"dist"更安全,尤其在 monorepo 场景下
全局搜索时误用通配符的典型报错和表现
VSCode 不会直接报错,但会静默失败或行为异常。最常遇到的是:搜索结果为空、速度极慢、或匹配了本该排除的文件。
- 在主搜索框里输入
import * as React并勾选.*→ 实际执行的是正则匹配,*被解释为“前一个字符重复零次或多次”,变成import as React(空格重复),根本搜不到 - 在
files to include填src/**/*.js却没生效 → 检查是否多打了空格,或用了中文逗号,或路径大小写与实际不符(Linux/macOS 区分大小写) - 配置
search.exclude后仍搜到.git文件 → 确认写的是"**/.git": true,而不是".git"或"**/.git/**"(后者语法合法但冗余) - 用
**/*.min.js排除压缩文件,但某些构建工具生成的是.mjs→ 需补充**/*.mjs,通配符不会自动泛化后缀
真正容易被忽略的是:通配符只控制「哪些文件参与搜索」,不控制「文件里搜什么内容」。内容匹配必须靠正则或纯文本。两者职责分明,混用就会白忙活。


















