$1 在 Find in Files 中无效,因该功能不支持捕获组引用;仅当前文件 Replace(Ctrl+H)在正则启用、含括号捕获组、未跨文件搜索时可用。

为什么 $1 在 Find in Files 里不输出捕获内容
因为 Replace in Files(Ctrl+Shift+H)面板根本不支持 $1、${2} 这类捕获组引用——它把替换字符串当纯文本处理。这不是你正则写错了,是 Sublime 的硬限制。
真正能用 $1 的地方只有当前文件的 Replace 面板(Ctrl+H),且必须满足三个条件:
-
.*图标已点亮(正则模式启用) - 查找框中明确写了带括号的捕获组,比如
data-id="(d+)" - 没在
Where栏填*或留空,否则跨文件时作用域失控,$1可能引用到非预期位置
怎么写正则才能只提取引号内的标记,不带前后结构
关键不是“匹配整行”,而是“最小化捕获范围”。比如要提 class="btn primary" 中的 btn primary,不能写 class="(.*)",否则会从第一个 " 吃到文件末尾最后一个 "。
- 用
class="([^"]*)":其中[^"]*表示“任意个非双引号字符”,天然止步于闭合引号 - 如果标记可能混用单/双引号,改用
class=(["'])([^"']*),确保首尾引号类型一致 - 若标记含空格或连字符(如
data-role="modal-overlay"),仍用[^"'>s]+替代.*?,避免吞掉后续属性
提取后粘连成一行?那是你漏了换行逻辑
Sublime 的 Find All 结果复制出来默认是“高亮片段拼接”,不会保留原行结构。这不是正则问题,是结果整理环节缺失。
- 先用
Ctrl+H→ 查找class="([^"]*)",替换为$1(加换行符) - 或复制全部结果后,在新文件中执行:
Find All匹配s*→ 替换为去多余空行 - 如果原始标记分散在多行(如
data-attr="value1" data-attr="value2"),需先勾选. matches newline,再用data-attr="([^"]*)"跨行捕获
遇到嵌套引号或 HTML 注释就该停手
像 title="A "quoted" string" 或 <!-- <div class="x"> --> 这类结构,Sublime 正则无法可靠解析。它不处理 HTML 实体解码,也不跳过注释块。
-
"不会被自动转成",[^"]*会在第一个"就终止,导致截断 - 注释中的引号会干扰匹配,必须提前用
<!--[\s\S]*?-->单独清理 - 文件超 500KB 或标签未闭合时,
[\s\S]*?易卡死或匹配溢出——这时该切到 Python 用BeautifulSoup或浏览器环境跑getAttribute
真正难的从来不是写出 $1,而是判断什么时候不该用它。

















