使用捕获组(如$1、$2)可精准保留缩进、函数名等结构,避免丢失;Sublime中必须用$1而非\1;跨行替换需用R代替\n确保跨平台兼容;删空行或补换行须显式匹配R。

用捕获组保留原内容再重组
直接替换会丢掉想留下的部分,比如要把 function foo() { 改成 const foo = () => {,但又不能把缩进、函数名、花括号前的空格全扔掉。这时候必须用括号 () 把要保留的部分圈出来,再在替换框里用 $1、$2 引用。
常见错误是写成 \1 —— Sublime 只认 $1,\1 是字面量反斜杠加 1,不会被解析为捕获内容。
- 查找:
^(\s*)function (\w+)\(\) \{(^(\s*)捕获行首缩进,(\w+)捕获函数名) - 替换:
$1const $2 = () => {($1复用缩进,$2复用函数名) - 必须勾选
.*正则模式,否则括号和$1全部失效
跨行结构替换时缩进错乱怎么办
处理 if 块、多行注释或 JSX 标签时,如果只匹配主体不带缩进,替换后所有内容都会顶到行首。根本原因不是正则写得不够准,而是没把空白字符作为结构的一部分捕获进来。
例如替换 JSDoc 注释块:/** @param {string} a */ → /** @param {string} a - */,若不捕获开头的 /** 和换行后的空格,新内容就会贴着左边跑。
- 查找:
/\*\*\s*(@\w+\s+\{[^}]*\}\s+\w+)\s*\*/(\s*吃掉可能的空格和换行) - 更稳写法:开头加
(?m)让^和$按行生效,配合^(\s*)/\*\*捕获缩进 - 替换前务必点
Find All看高亮是否符合预期,尤其注意空行和缩进是否被正确包含
为什么 R 比 \n 更可靠
Windows 文件用 \r\n,macOS/Linux 用 \n,旧 Mac 甚至用 \r。只写 \n 查找换行,在 Windows 文件里大概率漏掉一半——因为 \r\n 中的 \r 不被匹配,\n 只吃掉后面那个字符,结果留下孤立的 \r,显示为乱码或异常符号。
R 是 Sublime 内置的跨平台换行符别名,等价于 \r\n|\r|\n,不用管源文件来自哪个系统。
- 合并多行为一行:查找
R,替换为空格或逗号 - 删空行:查找
^\s*$R,替换为空(注意不要勾选↩ . matches newline,否则^和$失效) -
R不能放进字符类,比如[R]是非法语法,会报错
替换后空行残留或末尾缺换行
用 ^\s*$ 删除空白行,看似干净,实际常导致文件末尾没有换行符,Git 提示 “no newline at end of file”;或者替换后空行变“隐形”,看着空,其实每行末尾还卡着一个 \n。
关键不是正则写得不够狠,而是匹配范围没覆盖换行符本身。
- 删空行:查
^\s*$R(R显式吃掉换行符),替为空 - 补末尾换行:查
R$(文件末尾的换行),替为空,再手动按一次 Enter,或查$替换为R - 如果开了
↩ . matches newline,^和$会跨行匹配,^\s*$可能吞掉整段代码开头的空格,慎开
最易忽略的是:所有涉及 R 或 \n 的操作,都依赖正则模式开启且未被插件劫持快捷键;测试时永远先 Find All 看高亮,再点 Replace All —— 多行文本一旦误操作,Ctrl+Z 只能撤回当前文件,跨文件替换不可逆。

















