必须开启(?s)模式才能让.匹配换行符,否则console.log()跨行调用无法匹配;删空行与加间隔需分两步操作;替换框中须用快捷键插入真实换行而非\n。

查找含换行的内容必须开(?s)模式
默认情况下,. 不匹配换行符,^ 和 $ 也只锚定单行边界。搜 console.log\([^)]*\) 在跨行调用里必然失败——不是正则写错了,是模式没切对。
必须在表达式最前面加 (?s),例如:(?s)console.log\([^)]*\)。注意:(?s) 只影响它后面的 .,不影响 [^)] 这类字符类;如果参数本身含换行,得改用 (?s)console.log\((.*?)\) 并人工确认括号闭合位置。
常见错误现象:
- 单行能匹配,多行就零结果
- .*? 看似匹配了,但高亮范围远超预期(吞掉整段注释或函数体)
- 替换后内容错位,甚至把 if (x) { 后的换行也吃掉
- 别用
[\s\S]*强撑:性能差,大文件易卡死 - 优先考虑先格式化再匹配:用 Prettier 或 JSBeautify 把跨行调用转成单行
- 执行前务必点
Find看高亮是否符合预期——跳过这步,90% 的误操作就发生了
查空行、删空行、加间隔必须分两步走
想用一条正则搞定“删空行+每行后加一个空行”,结果往往漏匹配、吃缩进、甚至干掉代码逻辑里的换行。根本原因:换行符在正则中既是内容又是结构分隔符,混用极易失控。
正确做法永远是分两步:
- 第一步删空行:查找
^\s*$\R,替换为空(\R跨平台兼容,比\n更稳) - 第二步加间隔:查找
$,替换为快捷键插入的真实换行(Windows/Linux 按Ctrl+Shift+Enter,macOS 按Control+Command+Enter)
注意:\R 只能在查找框用,不能放进替换框;\n 在查找框里只匹配 LF,Windows 文件里常见 \r\n,直接搜会漏掉。
清理末尾多余换行:查找 \R$,替换为空,确保文件以单个换行结尾——否则 Git 会报 no newline at end of file。
替换框里输\n就是字面量,不是换行符
在替换框里敲 \n,Sublime 就真当你是要输入反斜杠+n两个字符。JSON 或 JS 字符串里一旦出现,语法直接报错。
必须用快捷键插入真实换行:
- Windows/Linux:
Ctrl+Shift+Enter - macOS:
Control+Command+Enter
想插两个换行?连按两次快捷键,不是输 \n\n。另外:\R 在替换框完全无效,它只支持查找阶段。
还有一个隐藏坑:查找时用了捕获组,但替换框没点亮右下角的 .* 图标,$1 就只是两个字符,不会被替换成捕获内容。哪怕查找面板已开正则,替换面板的正则开关也是独立的,必须再点一次。
查每行末尾或开头,锚点和 . matches newline 冲突最致命
^ 和 $ 在替换中出错,90% 是因为误勾选了 . matches newline(那个 ↩ 图标)。一旦勾选,.*? 就会跨行吞掉整块结构,^ 和 $ 失效,加出来的换行全乱套。
所有涉及 ^、$、^(\s*) 的操作,务必确认 ↩ 图标未激活。
给每行末尾加内容(比如分号):查找 $,替换为快捷键插入的换行或字符。
给每行开头加内容但避开首行空行:先手动选中第二行起的所有行,再操作;或者用 ^(\s*)foo → $1bar 捕获缩进,否则新内容全顶到左缘。
最容易被忽略的是当前文件的 line_ending 设置——右下角显示什么,最终保存的就是什么。批量操作前,先确认它是 LF 还是 CRLF,别等改完了才发现输出格式不对。


















