直接搜 href="(.+?)" 会抽错,因不区分引号类型且贪婪跨标签;稳写法是 href=(["'])(1)\1,捕获引号类型并强制同类型闭合,1防跨标签、换行及嵌套,URL 在 $2;须先折叠 script/style、跳过注释,再用 Alt+Enter 精准复制纯链接。"' ↩

为什么直接搜 href="(.+?)" 总抽错?
因为这个正则不区分引号类型,遇到 href="/path" onclick="foo" 会一路吃到第二个双引号,结果是 /path" onclick="foo;更糟的是,它完全不管换行、注释或 <script> 里的字符串。Sublime 不解析 HTML,只当它是纯文本——你给它什么模式,它就机械匹配什么。
真正能稳住的写法是:href=(["'])([^"']*)\1。(["']) 捕获开头引号类型(单或双),\1 强制结尾必须用同一种引号闭合,[^"']* 只允许非引号字符,天然防跨标签、防嵌套、防换行吞掉后续内容。
- 别强行兼容无引号写法(如
href=/path),HTML5 虽允许,但加进去会让正则变松,误匹配风险陡增 - 必须用括号把 URL 部分包住,否则
Find All后复制出来的是整个href="xxx",不是你要的链接文本 -
Find All默认只选中匹配内容本身,不是整行——这是优点,也是坑:没写对捕获组,你就白忙
如何确保只抽真实链接,避开 script 和注释?
Sublime 不知道哪段 href= 是真链接,哪段是 <script>console.log('href=fake')。它只认字符,不认语义。所以“避开”不是靠正则判断,而是靠人工清场 + 范围控制。
- 先按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Fold Tags并回车——所有<script>、<style>、<noscript>块会被折叠,折叠后的内容不参与查找 - 再用
<!--[\s\S]*?-->查找全部注释,按Esc跳过不替换(或全选后剪切暂存) - 如果已打开大文件(>5MB),建议先手动删掉
<script>和<style>块再跑正则,速度提升明显,也避免错位
Find All 后怎么只复制链接文本,不带引号和属性名?
关键在捕获组编号和触发方式。写成 href=(["'])([^"']*)\1 后,URL 实际在 $2(第一个括号是引号类型,第二个才是值)。但 Sublime 默认 Find All 后高亮的是整个匹配项,直接 Ctrl+C 还是会复制 href="https://a.com"。
- 必须按
Alt+Enter(Win/Linux)或Cmd+Enter(macOS)执行Find All—— 这个操作会让光标精准落在([^"']*)内容上,此时Ctrl+C复制的就是纯 URL - 粘贴到新窗口后,每项自动换行;若有空行或首尾空格,后续可用
^\s*$删空行,^\s+|\s+$清理空格 - 如果想批量转成 Markdown 链接,可再开一次替换:
Find:^(https?://[^\s"')\]\]+)$,Replace:[$1]($1)
提取 src、data-src 等其他属性时要注意什么?
结构一致,但捕获组编号会变。比如写成 (href|src|data-src)=(["'])([^"']*)\2,此时 URL 在 $3,不是 $2——因为 (href|src|data-src) 占了第一组,(["']) 是第二组,([^"']*) 才是第三组。
-
srcset不能直接套用,它是逗号分隔列表,得先用srcset\s*=\s*["']([^"']*)["']提整段,再手动拆分或丢给 Excel 处理 - 想筛掉相对路径?在查找里加协议约束:
href=(["'])(https?://|//)[^"']*\1 - 如果结果里混进
javascript:void(0)或#,别改正则,用第二轮过滤:^(?!https?://|#|javascript:|mailto:).*$,勾选. matches newline,全选后删除
Fold Tags 直接开搜,结果一半是 <script> 里的假链接。还有就是复制前没按 Alt+Enter,导致粘出来全是带引号的脏数据。这两步一漏,后面全白干。

















