Sublime Text正则处理Markdown标题需用^(#{1,6})(?!#)\s+(.+?)$匹配并捕获层级与文字,避免缩进、代码块干扰;替换时用$1# $2升阶或$2转HTML,关键要启用正则模式、禁用.匹配换行,并用断言确保精准定位。

Sublime Text 用正则处理多级标题(如 # 标题、## 子标题)时,不能直接靠 ^# 匹配开头——它会被缩进、空格、注释甚至代码块里的 # 干扰;真正能稳住的,是结合行首锚点、可选空白、边界控制和捕获组重排。
为什么 ^# 总匹配错位置
Sublime 的 ^ 默认只认物理行首,但 Markdown 文件常有缩进、列表嵌套、引用块或代码段里的 #,这些都会被误抓。更麻烦的是,# 在代码块中(比如
# comment
)也会被扫进来——正则不识别语法结构,只看字符流。
- 确保启用
.*按钮(正则模式),否则^当普通字符处理 - 勾选右下角
. matches newline(Alt+R 再 Alt+.),否则跨行内容无法参与匹配 - 若目标仅限普通段落,先手动选中所有非代码块区域,再按
Ctrl+H→ 勾选In Selection
## → ### 这类层级平移怎么写才不越界
想把所有二级标题升一级,写 ^## → ### 看似简单,但会漏掉末尾带空格的 ## 、匹配到 #### 的前两个 #、甚至把 ##some_id(无空格)也拖下水。
- 安全写法:
^(#{2,5})\s+(.+)$,替换为$1# $2—— 用{2,5}限定原始层级范围,避免无限贪婪 - 更稳加边界:
^(#{2,5})(?!\#)\s+(.+)$,(?!\#)确保后面不是另一个#,排除###被截成##+# - 如果只想动
##不碰###,直接用^##(?!\#)\s+,注意结尾的\s+必须保留,否则空格会被吞掉
把 # 标题 批量转成 HTML 的 <h1></h1> 格式
纯文本替换容易崩:没捕获标题文字就硬写 <h1>$0</h1>,会把 # 和空格一起包进去;若用 ^#\s+(.+)$,又可能漏掉末尾换行符导致闭合标签错位。
- 推荐查找:
^#\s+(.+?)(?=\n|\r\n|$),其中(.+?)非贪婪捕获标题文字,(?=\n|\r\n|$)向前断言换行或结尾,不消费字符 - 替换为:
<h1>$1</h1>,干净只包内容 - 若要兼容末尾空格(如
# 标题),把\s+改成\s*,并确保. matches newline关闭——否则.+?可能跨行吃掉后续段落
批量清理标题末尾的 {#id} 锚点
Markdown 标题后常跟 {#my-id},想删掉它但保留标题本身。直接搜 {#.*?} 会误杀代码块或链接里的花括号;只搜行尾又怕标题跨行。
- 精准定位:用
^(#{1,6}\s+.+?)\s*\{#[^\}]*\}\s*$,^和$锁定整行,\{#[^\}]*\}严格匹配锚点格式 - 替换为:
$1,只留前面捕获的标题部分 - 操作前务必点
Find All看高亮——尤其检查是否误中了类似text {#id} more text这种非标题行;若有,得加(? 回溯断言强化前提
最易忽略的一点:Sublime 不会自动跳过代码块或注释,所有正则都是裸文本扫描。哪怕你写了再精确的 ^##\s+,只要文件里某处有 ## not a heading(4空格缩进),它照样匹配——因为对 Sublime 来说,那只是“行首有空格+##”。真要语义安全,得先人工隔离区域,或导出为纯文本再处理。











