^和$只匹配全文首尾因sublime默认将二者锚定整个文本而非每行,需启用多行模式(勾选⇧或加(?m));windows下$停在\r前易残留换行,应改用\r;.默认不跨行,跨行须显式加(?s)或用[\s\s];$1不生效多因未开正则模式或捕获组未正确书写。

为什么^和$只匹配全文首尾,不按行生效
Sublime 默认把 ^ 当作文本开头、$ 当作文本结尾,不是每行的起止位置。搜 ^import 只能高亮第一行,其他行里的 import 全被忽略。
必须启用多行模式:点替换面板右下角的 ⇧ 图标(或按 Alt+M),或在正则前加 (?m),比如写成 (?m)^import。
Windows 下 $ 会停在 \r 前,导致换行残留;统一用 \R 更稳,它是 Sublime 内置的跨平台换行符(等价于 \r\n|\n|\r)。
- 状态栏编码不是
UTF-8时,中文环境下^/$可能因乱码失效,先执行File → Save with Encoding → UTF-8 with BOM - 勾选了
. matches newline(↩图标)后,^和$行为会进一步变化,慎开
跨行匹配必须显式启用 (?s),不能只靠 .
. 默认不匹配换行符,写 a.b 永远不会跨行匹配 a\nc。很多人以为开了 .* 就能跨行,其实只是启用了正则引擎,没改 . 的语义。
要真正跨行,得在正则开头加 (?s),例如 (?s)start.*?end 才能匹配含换行的块。
- 别混用
(?s)和. matches newline:后者会让.匹配换行,但也会让^/$失效(除非同时加(?m)) - 处理 JSON 或 HTML 片段时,优先用
[\s\S]替代.*?,更可控、不易卡死 - 大文件中用
(?s)配合贪婪量词(如.*)容易假死,改用.*?或限定字符集(如[^}]*)
$1 不展开?检查捕获组和模式开关
替换框里写 $1 却输出字面量,八成是两个原因:查找框没用 () 定义捕获组,或根本没开正则模式(右下角 .* 没点亮)。
Sublime 查找时用 \1 引用捕获内容,但替换时只认 $1、$2——写成 \1 或 ${1} 都不会解析。
- 嵌套括号按左括号顺序编号:
((\w+))中,外层是$1,内层是$2 - 想输出字面量
$,必须写$$;单独写$会被忽略或报错 - 如果查找用了命名捕获(如
(?P<url>[^"]*)</url>),Sublime 不支持$url,只能用数字编号
删空行、加空行、插换行,三类操作不能混用
想“删空行并在非空行间加一个空行”,不能用一条正则硬凑,比如 ^\s*$\R → \n\n,\R 在正则中既是内容又是锚点,极易错位或漏匹配。
正确做法永远是分步:
- 删纯空行:
^\s*$\R→ 留空(关掉. matches newline) - 删含空白的空行:
^[ \t]*$\R?→ 留空 - 每行后加一个空行:
$→\n(同样关掉. matches newline) - 加完再补一刀:
\R$→ 留空,清理末尾多余换行
复杂点在于:\R 不能进字符类([R] 非法),也不能和 \n 混写(\R\n 报错);而 $ 插入的是“行尾位置”,不是换行符本身——所以加空行实际是“在换行符前再插一个”,视觉上才成空行。











