因为.默认不匹配换行符,是sublime底层python re引擎的硬性限制;需用[ss]、(?s)或\n等显式方式跨行,且$1生效须满足括号成对、替换写$1、regex状态激活三条件。

为什么 .* 在 Sublime 里跨不了行
因为 . 默认不匹配换行符,这是 Sublime 底层 Python re 引擎的硬性限制,不是你没点对按钮。哪怕 .* 图标已亮、^/$ 也生效,foo.*bar 遇到换行就停在第一行末尾,根本进不去下一行。
常见错误现象:单行 console.log("ok") 能搜到,但拆成两行就零匹配;/* ... */ 注释块只高亮开头 /*,后面全失效——基本就是这个原因。
- 别指望勾选
. matches newline就万事大吉:它在Ctrl+Shift+F(跨文件搜索)中大概率失效 -
(?s)是唯一被find_in_files正确识别的跨行修饰符,但必须放在表达式最前面,写成(?s)start.*?end,不能套在分组里如(?s:start.*?end) - 更稳的写法是显式用
[sS]:比如foo[sS]*?bar,它不依赖任何开关,所有场景通用,且非贪婪、不易卡顿
提取多行注释里的 URL 怎么写正则
直接写 (?s)/\*.*?API:\s*(https?://.*?)\*/ 看似合理,实则危险:中间的 .*? 可能吞掉下一个 /* 开头,导致跨块错位;若注释里有多个 API:,还可能捕获到错误的那行。
正确做法是锚定结构、限制范围:
- 起始用
(?s)/\*\s*,明确匹配/*后紧跟空白 - 中间跳过注释行:用
(?:[^*]|\*(?!/))*代替.*?,避免吃到*/ - URL 部分锁定字符集:
https?://[^s*]+,防止吃到空格或* - 完整表达式:
(?s)/\*\s*(?:[^*]|\*(?!/))*\s*API:\s*(https?://[^s*]+)
执行前务必勾选 In Selection,先手动框选目标注释块再操作,否则全局替换极易误卷。
替换后 $1 原样输出?三个检查点缺一不可
$1 不展开,99% 不是正则逻辑错,而是基础条件没满足:
- 查找框里括号必须成对且未转义:想匹配
fetch("url")中的"url",得写fetch\(["']([^"']*)["']\),漏掉反斜杠就会把括号当普通字符 - 替换框必须用
$1:写\1或${1}都无效,新版 Sublime 只认$1 - 右下角
.*图标必须点亮,且状态栏显示Regex—— 这个状态和查找面板不共享,Ctrl+H打开替换面板后要重新点一次
如果替换了 0 处,先看状态栏有没有 Regex,再检查查找表达式里有没有未转义的 .、?、* 等元字符被当字面量处理了。
删空行、合并段落,\s 为什么总出事
\s 在 Sublime 里会匹配 \r、\n、\t 和空格,看似方便,实则容易破坏换行结构:用 ^\s*$ 删空行,可能把 \n 也吞掉,导致相邻两行直接粘连;在 Unix 文件末尾还可能误删 \n,破坏文件规范。
- 删「真正空行」(允许空格/Tab,但不含换行):用
^[ \t]*$,显式限定字符集,避开\s的跨行副作用 - 合并连续空行为单个空行:查
\n{2,},替为\n\n(两个换行符),直接操作换行符,不碰\s - 段落间多个换行替成空格:查
\n\s*,替为一个空格,比\s+更精准,不会吃掉行首缩进
大文件里慎用跨行正则批量操作,尤其带 .*? 的表达式——回溯爆炸风险高,建议先用 Find in Files 定位范围,再分块处理。











