sublime text 默认不匹配换行符,因 boost.regex 中 . 不匹配 \n,需用 (?s) 启用单行模式;where 路径错误、排除语法失误或图标未变蓝均导致多行搜索失效。

Sublime Text 默认不匹配换行符,想搜多行文本必须显式启用跨行模式,否则 foo.*bar 永远找不到 foo\nbar。
为什么 foo.*bar 总是搜不到跨行内容?
Sublime 的正则引擎(Boost.Regex)默认把 . 当作“除换行符外的任意字符”,这是绝大多数正则实现的默认行为。没加修饰符时,.* 就卡死在单行内。
- 直接输
fetch\(\).*?\)→ 只能匹配同一行里的fetch(123),碰上换行就失效 - 想匹配
fetch(开头、)结尾、中间跨多行的内容?必须加(?s)前缀 -
(?s)是“single-line mode”开关,它让.也能匹配\n和\r
Where 路径填错会让多行搜索变无效
多行匹配本身依赖完整上下文,如果 Where 指定范围太窄或含排除项,可能根本读不到跨行片段所在的文件。
- 搜
(?s)console\.log$$.*?$$却只返回零星几条?先检查Where是否误写了src/而漏掉tests/下的测试文件 - 用了
-node_modules/, -dist/排除但忘了加逗号 → Sublime 把整个字符串当做一个路径前缀,实际没排除成功 - Windows 用户填
.\src\**.js→ 斜杠方向错误,\在 Sublime 里会被当字面量处理,应统一用/
替换多行内容时,$1 不生效的三个确认点
多行捕获后想用 $1 引用,必须同时满足三件事,缺一不可。
-
Find输入框右下角的.*图标要是蓝色 —— 否则(?s)和括号都不起作用 -
Replace输入框右下角的.*图标也得是蓝色 —— 否则$1被当普通字符串输出 - 查找表达式里必须有捕获组,即带括号的子表达式;
(?s)(console\.log$$.*?$$)才能用$1引用整段调用
删空行或合并多行时,\s 是个陷阱
\s 在 Sublime 里会匹配换行符,用它删空行或去尾空格极易破坏文件结构。
- 别用
^\s*$删空行 → 它可能把只有\r的行也干掉,导致 Git 显示 “missing newline at end of file” - 改用
^[ \t]*$:只认空格和 Tab,安全保留换行边界 - 删行尾空格用
[ \t]+$,不是\s+$;后者可能吞掉最后一行的\n,保存后少一行 - 替换框留空即可,不用填
\n或\r—— Sublime 自动保持原有换行格式
真正麻烦的从来不是正则怎么写,而是你有没有三秒时间看一眼 .* 图标颜色、扫一遍 Where 路径、点一下 Find All 预览——这三步跳过,后面 Git revert 的时间够重写两遍逻辑。











