安全提取markdown链接需分层处理:单行用\[.*?\]\((.*?)\),启用. matches newline预览确认;须人工排除代码块,替换为$1;禁用贪婪跨行与误匹配。

Sublime 处理 Markdown 文档的正则操作,核心难点不在语法本身,而在于「行内语义」和「块级边界」的混淆——比如用.*?提链接,极易跨行吞掉段落;用^#.*$删标题,可能漏掉缩进的 ATX 标题或误杀代码块里的#。必须按结构分层处理,不能一招打天下。
怎么安全提取 Markdown 链接(含换行、转义)
Markdown 链接形如[text](url "title"),但实际文档里常有换行、括号嵌套、引号转义,$$.*?$$会越界匹配到下一个)。
- 单行链接:用
$$(.*?)$$→ 安全,.*?在单行内不会跨界 - 含换行的 URL 或 title:关闭
. matches newline,改用$$(\[[^\]]*\]|[^\(\)]|\([^)]*\)|[^"()]|"[^"]*")*$$太重,不推荐;更稳做法是先启用. matches newline,再用$$(.*?)$$配合Find All预览,确认只圈中完整链接对 - 要排除代码块里的链接:正则无法可靠跳过 fenced code block,得先人工选中非代码区域(Ctrl+Shift+P →
Restrict Find to Selection),或用插件预处理 - 提取后想转成 HTML:
替换为@#@#@#@#@#@#@#@#@#@0,查找写$$(.*?)$$\(([^)]+)\)(注意括号严格配对,$1是文本,$2是 URL)
删空行和多余空白行时为什么总留尾巴
用^\s*$删空行,常导致末尾多一个空行、或段落间只剩一个空行却删不干净——根本原因是\s匹配\n,把行尾换行符也吞了,破坏上下文。
输入文章 URL,返回干净 Markdown。支持17个平台(头条、微信公众号、知乎、36kr、虎嗅、华尔街见闻、澎湃、InfoQ 等)专项优化,双引擎提取、图片本地化、三层抓取策略。常与 browser‑web‑search skill配合:先用 bws 搜索获取 url 列表,再逐篇调用本 skill 提取正文。
- 正确写法是
^[ \t]*$:只清空格和 Tab,不碰\n,保留段落结构 - 若需清理「空行 + 后续缩进行」这类伪空行(如空行后跟 4 个空格),加 Unicode 范围:
^[ \t\u3000\xA0]*$ - 删完发现最后一行没被清?因为
$不匹配文件末尾(无换行符时),得手动补删,或用^[ \t]*$\R?(\R是 Sublime 内置通用换行符) - 批量前必做:File → Line Endings → Unix,避免
\r\n干扰^/$行为
批量修正 Markdown 标题层级(如 ## → ###)
直接搜^## 替换成### 看似简单,但容易误改列表项- ## text、代码行console.log("## test"),或漏掉##text(无空格)。
- 锚定行首且防误触:用
^(#{2,})[ \t]+,替换为$1#(加空格确保格式合法) - 想升一级(##→###,###→####):查找
^(#{2,})[ \t],替换为$1#;注意$1捕获的是原始##或###,所以$1#自然叠加 - 降一级(###→##)更危险:不能简单删一个
#,得限定最小数量,如^(#{3,})[ \t]→$1去掉首#,但 Sublime 不支持$1切片,只能手写^(#{3})(.*)$→$2(仅适用于固定三级) - 所有操作前点
Find All,重点看是否圈中了 YAML front matter 里的title: "## heading"——这种必须排除
为什么跨文件替换 Markdown 表格或列表老是失效
Ctrl+Shift+F 全局替换时,^|.*|$之类匹配表格行,常无结果或错配——不是正则写错,而是作用域失控。
- Where 路径必须限定:
src/**/*.md比*安全,node_modules和dist默认被扫入,可能卡死或误改构建产物 - 项目未加载:状态栏左下角没显示路径 → File → Open Folder… 加载根目录,否则
Where填什么都无效 - 替换后文件没变星号:Sublime 不自动保存,必须手动
File → Save All(或 Ctrl+K → Ctrl+B) - 表格线含混合空白(Tab + 空格)时,
^|.*|$可能漏匹配:改用^\|[^\n]*\|$,显式排除换行符,比.*更可控
最易忽略的是:Markdown 的语义边界(如代码块、HTML 块、注释)天然抵抗正则,强行用.*?跨这些区域,90% 会越界。真要处理复杂结构,该让位给 Pandoc、remark 或编辑器原生命令,而不是在正则里硬扛。










