Obsidian转Anki插件正则表达式功能解析及优化需求
正则表达式功能逻辑解析
这是Obsidian转Anki插件中用于匹配「Markdown标题+对应内容块」的正则,完整表达式如下:
^#+(.+)\n*((?:\n(?:^[^\n#].{0,2}$|^[^\n#].{3}(?<!<!--).*))+)
逐段拆解逻辑
1. 标题匹配段:^#+(.+)
^:锚定到文本行开头,确保只匹配行首的#号(避免误将段落中的#号识别为标题)#+:匹配1到6个#号,对应Markdown的1-6级标题(.+):捕获#号后的标题文本,+保证标题至少包含一个有效字符,排除空标题
2. 标题后空白处理:\n*
匹配标题行结束后0个或多个换行符,允许标题与内容之间存在空白间隔。
3. 内容捕获段:((?:\n(?:^[^\n#].{0,2}$|^[^\n#].{3}(?<!<!--).*))+)
这部分是核心内容匹配逻辑,仅捕获非标题行,通过分支规则过滤特定行:
- 外层
(?:...)为非捕获组,+表示重复匹配多行内容 \n:强制每一行内容从新行开始,避免与标题行混淆- 内部两个分支用
|分隔:- 分支1:
^[^\n#].{0,2}$:匹配行首不是#、内容长度≤2的行(比如短符号行、仅含空格的行) - 分支2:
^[^\n#].{3}(?<!<!--).*:匹配行首不是#、内容长度≥3的行,同时通过(?<!<!--)负向后断言排除以<!--开头的注释行
- 分支1:
关键问题说明
- 空行停止捕获的原因:空行结构为
^$,不满足两个分支的^[^\n#]条件(行首无非#/非换行的字符),正则会判定内容块到此结束,停止捕获。 - 移除
\n破坏嵌套标题识别的原因:\n是分隔标题行与内容行的关键锚点,移除后正则无法区分当前内容与下一个标题行(下一个标题的#号会被纳入内容匹配分支),导致嵌套标题被误判为当前标题的内容,无法正确分割不同标题块。
内容的提问来源于stack exchange,提问作者josem8f
相关产品推荐
相关产品推荐

