统计Markdown标题数量时容易忽略的三个细节:围栏代码块、行首空格与Setext标题

举报
yd_259061519 发表于 2026/11/04 17:23:11 2026/11/04
【摘要】 统计Markdown标题时,只匹配行首#号会数错:围栏代码块里的#号不是标题,行首1到3个空格仍是标题、4个空格则不是,Setext风格标题根本没有#号。本文给出这三点的判断方法与验证清单。

用脚本统计Markdown各级标题数量时,最简单的办法是逐行匹配“行首的#号”。这个办法在干净的文档里没问题,但在真实文档里很容易数错。下面三个细节,是我在写这类脚本时实际踩到、也最容易被忽略的。


一、围栏代码块里的“#”不是标题

代码示例里经常出现以#开头的行,例如Shell注释、Python注释、配置文件里的注释行。如果脚本不区分代码块,就会把这些行全部算成标题。正确做法是先维护一个“是否在围栏代码块内”的状态:遇到以```或~~~开头的行就切换状态,处于代码块内时跳过标题统计,遇到闭合围栏再恢复。只看单行正则、不看上下文,是这类统计最常见的错误来源。


二、行首最多三个空格仍是标题,四个空格就变了

按照CommonMark的规则,ATX标题行首最多可以有三个空格,超过三个空格后该行会被解析为缩进代码块,而不是标题。写正则时如果只写“行首必须是#”,就会漏掉带一到三个空格缩进的标题;如果写成“任意空白后接#”,又会把四个空格的缩进代码误算进去。稳妥的写法是允许0到3个空格,再匹配1到6个#号,后面还要有空格或行尾。


三、Setext标题没有#号,容易被漏数

除了#号标题,Markdown还有Setext风格:一行普通文本,下一行是连续的=号表示一级标题,连续的-号表示二级标题。例如“项目简介”下一行写“========”,渲染后就是一级标题。只统计#号的脚本会把这类标题全部漏掉。处理办法是按行配对判断:当前行是非空文本、下一行全部由=或-组成时,把当前行计为一级或二级标题,同时注意不要把列表项、分隔线和Setext下划线混淆。


一个可直接复用的检查清单

1、先处理围栏代码块,块内内容一律不计标题。

2、ATX标题只接受行首0到3个空格、1到6个#号、#号后有空格或行尾的形式,结尾多余的#号不影响级别。

3、再补一遍Setext配对判断,避免漏数无#号的标题。

4、最后用一小段已知样例验证:样例里应同时包含代码块里的#号、带缩进的标题、Setext标题和分隔线,确认每一项的计数都符合预期,再用脚本跑真实文档。


把这三点处理好,统计结果才和渲染后的文档结构一致;否则数字看起来精确,实际上从第一步就数错了对象。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。