不能真正“一键”完成,必须分步操作且人工核验:先删块注释(需启用 . matches newline 并用 /*[\s\S]?*/),再删行首注释(需禁用 . matches newline 并用 ^\s(?://|#).*$),最后清空行(用 ^\s*$)。

不能真正“一键”完成,必须分步操作且人工核验——空行和注释的删除逻辑冲突、匹配边界不同,强行合并正则极易误删或漏删。
先删块注释:/\*[\s\S]*?\*/,必须勾选 . matches newline
块注释(/* ... */)跨行时,. 默认不匹配换行符,/\*.*?\*/ 会失效。只有 /\*[\s\S]*?\*/ 能稳定覆盖所有行,前提是右下角 .\n 图标点亮(启用 . matches newline)。
不勾这个选项,多行注释几乎全漏;勾了但用 /\*.*?\*/,可能从第一个 /* 吞到文件末尾最后一个 */,中间代码全丢。
替换成空字符串即可,但注意:它无法识别字符串内的 /*,例如 const s = "/* not a comment */"; 会被误删——这不是正则问题,是 Sublime 不做语法解析。
再删行首注释:^\s*(?://|#).*$,禁用 . matches newline
这一步只匹配整行以 // 或 # 开头的注释(允许前面有缩进),避开 https://、url#anchor、int x = 1; // init 这类危险位置。
必须关掉 . matches newline,否则 .*$ 可能跨行吞内容;也不能用 //.*$ 简单扫,它会在 JSON 字符串或正则字面量里误触发。
Python 文件要换用 ^\s*#.*$,但三引号字符串("""...""")里的 # 仍可能被误伤,需提前切语法为 Python 再操作。
最后清空行:^\s*$,替换框绝对留空
^\s*$ 匹配所有“视觉为空”的行(含空格、Tab、全角空格、BOM 等),比 ^$ 可靠得多;^$ 遇到缩进空行就失效。
关键设置三点:右下角 .* 图标点亮(启用正则)、.\n 图标未高亮(禁用 . matches newline)、替换框彻底为空——填 \n 或空格会导致空行翻倍。
若文件末尾无换行符,最后一行空行可能不被 ^\s*$ 匹配,补救方法是光标移到该行开头,按 Ctrl+Shift+K(Windows/Linux)或 Cmd+Shift+K(macOS)手动删。
顺序错不得,预览缺不得
块注释必须先删,否则行注释正则可能被块注释内部的 // 干扰;行注释删完再清空行,否则注释行删成空行后会被后续步骤重复处理。
每步执行前务必点 Find All,看右下角匹配数是否合理:超 5000 行建议分段处理;抽检至少三处——开头、核心逻辑块、配置节末尾;删完立刻 Ctrl+Z 回退验证,比事后恢复快得多。
真正容易被忽略的是:删完后文件末尾可能没换行符,而 Python/Shell 项目常要求 POSIX 兼容,得手动补或运行 Ctrl+Shift+P → Insert Final Newline。


















