必须先点击 . 按钮启用正则模式,否则 \d、^、. 等均按字面量处理;跨行匹配需用 [\s\s]? 而非 .;替换仅支持 $1 形式,不识别 \1;全局替换务必过滤目录避免误改 node_modules。

必须先点 .* 按钮,否则所有正则都当字面量处理
VSCode 的正则引擎默认是关闭的。不点右上角那个 .* 图标,\d 就是反斜杠加 d,^ 就是普通字符 ^,. 也不匹配任意字符——它只匹配点号本身。
常见错误现象:
- 输
\d+却只高亮字符串 "\d+",不是数字 - 用
console\.log$$.*?$$找不到任何console.log()调用 - 替换框里写
$1,结果原样输出 "$1",没被解析
正确做法:
- 每次打开
Ctrl+H或Ctrl+Shift+F后,第一件事是确认.*图标已点亮(变蓝) - 快捷键
Alt+R(Windows/Linux)或Option+R(macOS)可快速切换正则模式 - 面板右下角显示
Regex标签才算真正启用
跨行匹配只能用 [\s\S],. 永远不匹配换行符
VSCode 不支持 /s(dotAll)标志,. 在任何情况下都不吃换行符。想匹配多行内容,必须显式写 [\s\S] 或 [^]。
典型使用场景:
- 提取 JSX 中带换行的标签:
<div>([\s\S]*?)</div> - 删掉整个多行注释:
/\*[\s\S]*?\*/ - 匹配 JSON 块:
{[\s\S]*?}(比.*安全,避免贪婪吞太多)
容易踩的坑:
- 写
<button>(.*)</button>—— 它根本不会跨行,且可能因贪婪匹配撑爆内存 - 用
.*\n.*试图“模拟”跨行 —— 实际上只匹配两行紧挨着、中间一个换行符的情况,不可靠 -
[\s\S]*不加 ? 是贪婪的,可能一次吞掉多个块,建议优先用[\s\S]*?
替换字段只认 $1,\1 会原样输出
VSCode 的替换语法严格遵循 JavaScript 风格:只支持 $0(整个匹配)、$1、$2… 引用捕获组。\1、\2 这类写法在替换框里就是纯文本,不会被解析。
实操要点:
- 搜
data-id="(\d+)",替成data-key="id-$1"—— 正确 - 搜
class="(\w+)",替成className="$1"—— 注意引号要手动加,VSCode 不补 - 想保留整段匹配?用
$0,比如给所有console.log前加debugger;:console\.log$$([^)]+)$$→debugger;\n$0
性能提示:
- 括号越多,捕获开销越大;非必要不分组,比如只替换固定前缀,直接写
oldText→newText - 需要分组但不引用时,用非捕获组
(?:...),例如(?:http|https)://
全局替换前必须过滤目录,否则 node_modules 会被一起改
Ctrl+Shift+H 是全局替换,范围极大,但 VSCode 不会自动跳过构建产物或依赖目录。不设过滤,replace 可能直接写进 node_modules 或 dist,导致项目崩溃。
安全操作清单:
- 在「包含文件」框填
**/*.ts或src/**/*.js,限定作用域 - 在「排除文件」框填
node_modules/**, dist/**, *.min.js, build/** - 点「查找全部」预览所有匹配项,尤其注意是否误中字符串或注释里的相似内容
- 复杂替换前先 commit Git,别依赖
Ctrl+Z—— 跨文件撤销有时不完全
最容易被忽略的一点:VSCode 的正则不支持 \K 或条件断言,也做不到“只在某上下文内替换”。如果逻辑太复杂(比如“只替换不在字符串里的 console.log”),就该考虑用脚本而不是硬扛正则。











