vscode替换必须用$1而非\1或${1},捕获组按左括号顺序编号,(?:)不占位;需先点击查找再替换;跨行匹配需用[ss]或(.| );注意正则开关点亮及括号闭合。

捕获组必须用 $1,不是 或 ${1}
VSCode 的替换引擎基于 JavaScript 正则语法,只认 $1、$2 这种写法。 会被当普通字符处理,${1} 会静默失败——连报错都没有,直接原样输出。比如想把 console.log("x") 换成 debug("x"),正则搜 console.log((.*)),替换字段必须填 debug($1),写成 debug() 或 debug(${1}) 都无效。
括号必须存在且编号连续,(?:) 不占位
捕获组编号严格按左括号顺序分配,(?:...) 是非捕获组,不参与编号。例如搜 imports+(?:defaults+ass+)?(w+)s+froms+['"](.+?)['"],第一个实际捕获组是 (w+),它对应 ;路径部分是第二个 (.+?),对应 。如果误以为 default 那个括号也占位,就会写错 引用位置。
全局替换前必须先点 Find All,否则 $1 不生效
Replace All 按钮只作用于当前已识别的匹配项,不是实时扫描。如果没手动触发查找,面板里空空如也,点 Replace All 就等于什么都没干。正确流程是:输完正则和 $1 替换式 → 点击搜索框右侧的放大镜图标(或按 Enter)→ 等左侧结果树展开 → 确认有匹配项 → 再点 Replace All。
跨行匹配时 . 默认不包含换行符
想用捕获组匹配多行内容(比如 JSX 属性值含换行),.* 会在第一行末尾断掉。必须显式写 [sS]* 或 (.|
)*。例如匹配 className="a
b" 这种带换行的属性值,得用 className=["']([sS]*?)["'],然后替换用 className="$1 new-class"。别依赖 UI 上那个 ↵ 按钮——它只在 Ctrl+Shift+F 全局搜索中有效,Ctrl+Shift+H 里不起作用。
真正容易被忽略的是:正则开关(.* 图标)是否点亮,以及 $1 前有没有未闭合的括号或转义错误。这两个地方一错,整个替换就静默失效,连预览都看不到匹配项。











