修改Obsidian-to-Anki插件正则以支持含空行的问答并匹配---结束符
Obsidian-to-Anki插件正则适配方案
原正则与疑问
我使用Obsidian-to-Anki插件时,采用了官方提供的正则:
^Q: ((?:.+ )*) *A: (.+(?: (?:^.{1,3}$|^.{4}(?<!<!--).*))*)
我对该正则的理解:
- 问题以行首的
Q:开头,捕获Q:后到答案开始前的内容; - 答案以行首的
A:开头,遇到插件标记AnkiID的HTML注释时停止捕获; - 不理解
^.{1,3}$的作用:这部分是匹配长度1-3的短行,原作者可能用来兼容短分隔行,但实际会导致代码块内的空行触发截断,这也是当前正则的问题之一。
修改需求
当前正则仅能匹配部分笔记,需要两处调整:
- 允许问答内容包含空行(避免代码块内的空行导致内容截断);
- 每个问答段以行首的
---结尾,答案需捕获到该行之前。
修改后的正则
^Q: ((?:.+\n?)*?)\s*A: ((?:.+\n?)*?)(?=\n---|\Z)
正则说明
^Q::精准匹配行首的问题标记;((?:.+\n?)*?):非贪婪模式捕获问题内容,\n?允许内容包含空行,*?确保不会过度捕获到答案区域;\s*A::匹配问题结束后到答案开始前的任意空白内容(包括空行);((?:.+\n?)*?):非贪婪模式捕获答案内容,同样支持空行;(?=\n---|\Z):正向预查终止条件,遇到换行后接---或文本结尾时停止捕获,确保答案截止到问答段的分隔线前。
匹配效果
针对提供的笔记片段,该正则可正确捕获三组完整问答:
- 第一组:问题为
null与undefined的区别?,答案包含文字解释、列表和带空行的代码块; - 第二组:问题为
使用[[JS Object.assign]]改写以下代码+代码块,答案包含文字说明和改写后的代码; - 第三组:问题为
全局isNaN()与Number.isNaN()的区别?,答案包含文字解释和对比列表。
内容的提问来源于stack exchange,提问作者Siraj Samsudeen
相关产品推荐
相关产品推荐

