编写正则匹配末尾无[#锚点]的1-4级Markdown标题
解决方案
直接在VS Code搜索框开启正则模式,使用以下表达式即可:
^#{1,4}\s+(?!.*\[#[^\]]*\]$).*$
规则说明
^#{1,4}\s+:匹配行首1到4个#符号,以及#后跟随的至少1个空格(符合标准Markdown标题语法,避免把正文里带#的标签误判为标题)(?!.*\[#[^\]]*\]$):负向预查逻辑,判断当前位置到行尾不存在[#锚点名称]格式的结尾标记,其中[^\]]*用来匹配锚点名称,避免锚点内出现]字符时匹配逻辑错乱.*$:匹配标题剩余的所有内容直到行尾
之前正则失效的原因
- 第一个正则
^#{1,4}.*\s(?!\[#.*\])$强制要求行尾前必须存在一个空白字符,仅当空白字符后不存在锚点标记时才命中,自然无法匹配末尾无多余空格的常规无锚点标题。 - 第二个正则
^#{1,4}.*(?!\[#.*\])$中.*是贪婪匹配模式,会直接匹配到整行的最末尾,此时后续没有任何字符,负向预查的判定条件永远成立,因此会匹配所有带/不带锚点的标题,出现误判。
匹配效果验证
测试用例下:
- 会命中
## My Big Heading这类无锚点标题 - 不会命中
## My Big Heading [#my-big-anchor]这类末尾带合规锚点的标题 - 兼容标题末尾带/不带多余空格的场景,无漏匹配、误匹配问题
如果需要兼容#后不加空格的非标准Markdown标题写法,可将表达式中\s+替换为\s*即可。
内容的提问来源于stack exchange,提问作者rhetoric101
相关产品推荐
相关产品推荐

