<p>Sublime 中 .* 无法跨行是因为 . 默认不匹配换行符,受 Python re 引擎限制;启用 (?s) 或使用 [sS] 可解决,但需注意其作用范围和兼容性。</p>

为什么 .* 在 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,再检查查找表达式里有没有未转义的.、?、*等元字符被当字面量处理了
^ 和 $ 匹配行为混乱,到底该开哪个开关
^ 和 $ 默认只匹配全文首尾而非行首行尾,必须启用多行模式;但开错一个开关,效果就完全相反。
- 默认情况下,
^import只会高亮文件第一行的import,其他行全忽略 - 启用多行模式:点击替换面板右下角的
⇧图标(或按Alt+M),或在正则前加(?m),写成(?m)^import - Windows 下
$会停在\r前,导致替换后残留回车;建议统一用\R(Sublime 内置通用换行符)代替$ - 注意:
. matches newline和multiline是两个独立开关——开了前者会让^/$退化为全文匹配,所以二者通常互斥
真正麻烦的不是语法本身,而是同一套正则在「查找」、「替换」、「跨文件搜索」三个入口下,开关状态不继承、不共享,且部分修饰符(如 (?s))只在特定路径生效。每次操作前,先确认当前面板右下角图标状态和状态栏提示,比反复调正则更省时间。

















