应仅对js/ts文件的字符串字面量安全替换双引号,用正则"([^"\]|\.)*"匹配成对引号并替换为单引号;json和jsx需单独处理或交由prettier统一管控。

不能无差别全局替换,必须分文件类型、分上下文处理;否则 JSON 会直接失效,JSX 属性可能错乱,模板字符串虽不中招但容易被误匹配。
只对 JS/TS 文件里的字符串字面量做安全替换
核心是匹配「作为字符串定界符的双引号」,而非所有出现的 "。VSCode 正则需启用(点击查找框右侧 .* 图标),然后:
- 查找:
"([^"\]|\.)*"—— 匹配成对双引号,支持内部转义(如"a"b"),跳过未闭合或含反斜杠中断的情况 - 替换:
'$1'—— 仅替换首尾引号,保留中间所有内容(含、"等) - 务必勾选
Match case,避免误中变量名里带"的极少数情况(如const _" = 1,虽非法但存在) - 不勾选
. matches newline,否则.*会跨行吞掉换行,破坏结构
JSON 文件必须跳过,强行替换等于制造语法错误
.json 文件里所有双引号都是语法必需,"key": "value" 换成 'key': 'value' 后,JSON.parse() 直接抛 SyntaxError: Unexpected token '。实操中:
- 在全局搜索(
Ctrl+Shift+H)时,用files to include排除**/*.json - 如果项目混用
.jsonc(带注释的 JSON),同样排除——注释里的"不是字符串,但正则无法区分,一并跳过最稳妥 - 别信“先备份再试”,JSON 格式校验严格,一个引号错就整个文件不可用
JSX 属性值需单独策略,不能和普通字符串共用同一正则
像 <div classname="foo"> 这类属性值,不是 JS 字符串字面量,而是 JSX 语法的一部分。上面那个 <code>"([^"\]|\.)*" 会把它当字符串匹配,但替换后变成 <div classname="foo">,虽然多数现代解析器能接受,但某些构建工具(如旧版 Babel 插件)或 ESLint 规则(<code>jsx-quotes)会报 warning 或 error。
- 如需统一 JSX 引号,建议改用 Prettier 配置:在
prettier.config.js中设jsxSingleQuote: true - 若坚持手动替换,限定范围为 HTML/JSX 文件,查找:
=s*["']([^"']*)["'],替换:= '$1'—— 但仅适用于无空格、无大括号表达式的简单属性(className="foo bar"可,style={{color:"red"}}不行) - 复杂 JSX 属性建议人工核对,正则在此场景可靠性低于人眼
真正省心又可靠的方式:交给 Prettier 自动化
手动正则替换本质是补救,而 singleQuote: true 是源头控制。它能覆盖 JS/TS/JSX/Vue/MDX 等主流格式,且天然规避 JSON 和模板字符串(`)问题:
- 确保项目根目录有
prettier.config.js,内容含singleQuote: true(不是字符串"true") - VSCode 设置中,
editor.defaultFormatter必须指定为esbenp.prettier-vscode - 禁用 ESLint 的自动修复(尤其
quotes规则),否则保存时可能反复来回切换引号 - 开启
editor.formatOnSave,后续所有新增/修改代码都会自动用单引号,无需每次手动搜
最易被忽略的一点:Prettier 不处理 .json 文件——这反而是优点,它默认跳过,不会碰你本就不该动的地方。











