VS Code正则需手动开启,快捷键Cmd+Option+R(macOS)或Alt+R(Windows/Linux)启用;全局替换用Cmd+Shift+H并配置包含/排除文件;捕获组替换用$1;跨行匹配须写[\s\S]*?而非依赖↵图标。

正则模式必须手动开启,否则所有元字符都当普通字符处理
VS Code 默认关闭正则引擎,^\s*$、\d+、console\.log 这些写得再准也没用——它根本不会解析为正则,而是逐字匹配字符串本身。最稳的开启方式是快捷键:Cmd+Option+R(macOS)或 Alt+R(Windows/Linux)。按一次,右下角出现 Regex 标签且搜索框右侧的 .* 图标变蓝,才算真正生效。
常见误操作:
- 点了
.*图标但没反应 → 先点击搜索框确保焦点在内,再按快捷键 - 关掉搜索面板重开 →
.*状态不保留,每次都要重开 - 误点
Aa或ab→ 它们会覆盖正则状态,导致图标看似亮着却失效
全局替换必须用 Cmd+Shift+H,不是 Cmd+Option+F
Cmd+Option+F(macOS)只打开当前文件的查找替换面板,无法跨文件;真正做「全局」替换,必须用 Cmd+Shift+H。这个快捷键直接唤起「在文件中替换」视图,默认扫描整个工作区,但默认范围太宽——它会扫 node_modules、dist、.git,极易误改。
务必立刻做三件事:
- 在「files to include」里填明确模式,比如
src/**/*.ts或*.html - 检查「files to exclude」是否还留着默认的
node_modules/**(若没排除,赶紧补上) - 别跳过预览:先按
Enter或点 Find in Files,看左侧结果树是否只命中目标文件
替换时捕获组必须写 $1,不是 \1 或 ${1}
VS Code 使用 JavaScript 风格替换语法, 是唯一合法的捕获组引用方式。写成 会原样输出文字 , 则直接报错或静默为空。
一个典型例子:
查找:import\s+\{([^}]+)\}\s+from\s+['"](.+)['"]
替换:import $1 from '$2/$1'; —— 正确
替换:import \1 from '$2/$1'; —— 错,输出字面量 \1
替换:import ${1} from '$2/$1'; —— 错,无效语法
额外注意:
- 想输出字面量
$,比如$price,必须写成$$price -
$&表示整个匹配内容,但易引发意外上下文依赖,优先用明确捕获组 - 非捕获组
(?:...)不产生编号,别指望它占位影响$1序号
跨行匹配不能只靠 ↵ 图标,得用 [\s\S]*? 显式写死
VS Code 默认的 . 不匹配换行符,所以 function\s+\w+\s*\([^)]*\)\s*\{.*\} 在多行函数里必然断在第一行末尾。UI 上那个 ↵(“匹配换行符”)图标只在 Cmd+Shift+F 全局搜索中有效,在 Cmd+Shift+H 全局替换里根本不起作用。
安全做法是把跨行逻辑写进正则本身:
- 用
[\s\S]*?替代.*?,显式覆盖空格与换行 - 匹配多行注释:
/\*[\s\S]*?\*/ - 匹配 JSX 中含换行的属性值:
className="[\s\S]*?" - 性能警告:避免无锚点的
[\s\S]*error这类开头,大文件会卡死或触发Too many results
真正难的不是写出能跑的正则,而是嵌套结构里的边界控制——比如 JSX 属性值里有引号嵌套、JSON 字符串里有转义反斜杠。这种时候,[\s\S] 能保命,但得手动验证每处上下文,因为 VS Code 的 Replace All 没 diff 预览,点了就写内存。


















