因为.默认不匹配换行符,是Sublime底层PCRE引擎的硬性限制;需用(?s)开头或[\s\S]*?跨行,^/$须加(?m)或勾选↩才按行匹配,$1生效需括号成对、替换写$1且Regex状态激活。

为什么 .* 在 Sublime 里跨不了行
因为 . 默认不匹配换行符,这是 Sublime 底层 PCRE 引擎的硬性限制,不是开关没点对。哪怕 .* 图标已亮、^/$ 也生效,foo.*bar 遇到换行就停在第一行末尾,根本进不去下一行。
常见错误现象:console.log("ok") 能搜到,但拆成两行就零匹配;/* */ 注释块只高亮开头 /*,后面全失效——基本就是这个原因。
-
(?s)是唯一被find_in_files正确识别的跨行修饰符,但必须放在表达式最前面,写成(?s)start.*?end,不能套在分组里如(?s:start.*?end) - 更稳的写法是显式用
[sS]:比如foo[sS]*?bar,它不依赖任何开关,所有场景通用,且非贪婪、不易卡顿 - 别信网上说的
(?s).*—— Sublime 的 PCRE 引擎不支持这种内联标志(实测无效) - 也别用
[\s\S]:Sublime 不支持\s在字符类中跨行,[\s\S]会被当作字面量处理,实际无效
^ 和 $ 为什么只匹配全文首尾,不匹配每行
默认情况下,^ 只匹配整个文本开头,$ 只匹配整个文本结尾。你写 ^import,只会匹配文件最开头那个 import,其他行的 import 完全不中。
解决方法只有两个:
- 勾选右下角的
↩(Match line breaks)按钮 - 或在正则开头显式加
(?m),比如(?m)^import - Windows 下
$默认停在\r前,建议统一用\R(Sublime 内置通用换行符)代替$
跨行提取注释块或结构化段落时怎么避免吞错内容
直接写 (?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,再检查查找表达式里有没有未转义的 .、?、* 等元字符被当字面量处理了。

















