第一次在知乎上写文章,也不会排版,各位将就看,如有错误之处请指出

首先,要感易小猫NetTeel为我们提供的anki选择题模板:

易小猫:Anki模板-Monokai程序员风格之随机选择题模板2.2zhuanlan.zhihu.com利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图1
NetTeel:【Anki模板】Monokai风格之随机选项多功能模板1.0(单选、多选二合一)zhuanlan.zhihu.com利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图2

还要感谢我见风声清风在侧NetTeel的文章:

清风在侧:使用宏制作选择题模板&Anki选择题的导入zhuanlan.zhihu.com利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图3
NetTeel:如何导入建造师题库到anki中zhuanlan.zhihu.com利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图4
我见风声:anki|批量制作选择题的另一种思路zhuanlan.zhihu.com利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图5

通过各位前辈的文章可以知道,需要将题库导入到anki,需要先将题库制作成符合格式要求的txt文件,具体的要求如下:

1、文档的编码格式为UTF8;

2、将每道题(每个卡片)放在一行内,根据模板的字段,将每道题中分属于不同字段的部分之间使用制表符(tab)分割。

注:anki中导入题库的时候,可以指定用空格来分割字段,但通常题库中的题干、选项或答案等部分可能会存在较多的空格,所以建议使用制表符(tab)进行分割比较可靠

由于多年前使用supermemo时制作过题库,结合以往的经验,决定使用notepad++和正则表达式替换来制作txt文件。

具体制作步骤如下

1、打开notepad++,将我们从网上能够获取到的选择题解析题库全选复制后,粘贴到一个文档内。为避免自动换行影响对实际换行的观察,在notepad++的视图中取消勾选“自动换行”,我们只需要看每一行的开头部分,就可以找出每一个换行符后面的文字特征。

利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图6

目前,我们从网上能够获取到的选择题解析题库的形式主要有两种:

  • 一种是在每道题的题干和选项后直接写出参考答案和解析,如下图:

利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图7

  • 一种是试题部分和答案解析部分完全分开成为两个部分,如下图:

利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图8

无论哪种形式,题干与选项之间、选项与选项之间、选项与答案之间、以及答案和解析之间通常都是用空格、制表符或换行符进行分割,要将每道题放在同一行内,需要将所有的换行符替换成制表符。但是,题库中每道题的题干与上一道题之间同样是使用换行符进行分割,直接将所有换行符替换成制表符,只能将全文转换到一行内,因此,需要将每道题题干前的换行符排除在外。

通过对上述题库的题干进行观察,每道题都是以“第n题”开头的,当然,不同题库中题干的开头可能也存在区别,比如“1、”或“1.”等等。根据这些特征将每道题题干中的换行符进行替换:

  • 使用ctrl+f打开查找对话框,勾选左下角的“正则表达式”,查找目标中输入:\r\n([^第\d{1,3}题])

利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图9

  • 点击计数,可以看到查找对话框底部会显示“计数:*次匹配”,
  • 然后点击替换,并在替换为中输入:\t\1

利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图10

  • 点击全部替换后,将每道题放在同一行内,如下图,题号与行号一致。

利用notepad  将选择题题库导入到anki(通用版) - 知乎 - 图11

通俗解释(尽量不涉及专业术语):

查找目标“\r\n([^第\d{1,3}题])”中

“\d”表示匹配数字0-9,“\d{1,3}”表示匹配任意一位到三位数,即0-999,这样,“[第\d{1,3}题]”就是用来匹配每道题前面的题号“第n题”;

中括号内的“第\d{1,3}题]”就表示不匹配每道题前面的题号“第n题”。

在“[^第\d{1,3}题]”的中括号外再增加一个半角圆括号是用来将其作为一个整体,

“\r\n”表示匹配换行,\r\n([^第\d{1,3}题])就表示匹配换行,且换行后跟着的不是每道题前面的题号“第n题”。

而替换为“\t\1”中的“\t”表示匹配制表符,即将“\r\n”(换行)替换成“\t”(制表)。

\1表示匹配第一个半角圆括号内的内容,即([第\d{1,3}题])匹配到选项A中的“A”,此处替换的时候,还是替换为“A”,即保留查找时所匹配的具体内容,从而实现仅仅对换行的替换。

2、对于第二中情况,若参考答案单独在一个段落内,需要先将每两道题的参考答案用换行分割开,通常参考答案具有如下特征:

  • 每道题的答案前有数字题号,
  • 题号前或/和题号后有标点符号,

假如题号前的标点为“;”,题号后的符号为“,”,可以在查找目标中输入“;\d{1,3},”,替换为中输入“\r\n”

就可以将参考答案转换成竖列,

灵活使用第1步和第2步的方法,可以将解析部分转换成数列。

然后将第一步处理好的题干和选项复制到excel中,然后在紧随其后的两列,分别粘贴本步中处理的竖排参考答案和解析,再将excel中的所有文字复制粘贴回notepad++。

注:notepad++本身也可以按列处理,按住alt键可以列选,不过个人感觉利用excel转换一下更加方便。

至此为止,处理好的txt文本具有如下格式:

题干(制表符)A选项(制表符)B选项(制表符)……D选项(制表符)答案(制表符)解析

题干(制表符)A选项(制表符)B选项(制表符)……D选项(制表符)答案(制表符)解析

3、由于NetTeel的模板是基于anki内部cloze模板制作的,要求题干字段至少要有一个{{c1::()}},因此采用如下替换式对题干进行处理

查找目标中输入“(^.*?)\t”;替换为中输入“\1{{c1\:\:()}}\t”。

替换为中的“\1”即为查找目标中的第一个半角圆括号所匹配的内容。

替换为中的“{{c1\:\:()}}”即为插入的{{c1::()}},在正则表达式中,半角的{、}和:需要与转义符\配合表示自身,即{在替换完成后就是{,\:在替换完成后就是:,}在替换完成后就是}。

4、NetTeel的模板中,选项整体为一个字段,而每个选项以换行符分隔,因此需要将所有选项包围在半角的引号内,且每个选项之间用换行符
标签进行分隔。

以四个选项ABCD为例,采用如下替换式进行处理:

查找目标中输入“A(.?)\tB(.?)\tC(.?)\tD(.?)”;替换为中输入“\”\1
\2
\3
\4\””。

替换为中的“\1”,“\2”,“\3”和“\4”分别为查找目标中的第一个、第二个、第三个和第四个半角圆括号所匹配的内容。

注:由于ABCD没有被半角圆括号包围,替换后不会被保留,如果选项的ABCD后跟有符号,如顿号,想要替换后同时不保留顿号,可以将查找目标中的“A(.?)\tB(.?)\tC(.?)\tD(.?)”修改成“A、(.?)\tB、(.?)\tC、(.?)\tD、(.?)”。

.表示匹配除换行符以外的任意字符,表示前面的重复N次匹配,?表示在遇到后面需要匹配的\t前,尽可能少的匹配,

\”表示替换后成为半角的引号。

至此,符号要求的txt文本制作完成,打开anki,导入文本,选择模板并指定字段导入即可。

由于本文成文过程是在本人自己制作题库后进行,再加上本人很少写文章,文章内的瑕疵较多,如有错误,请各位指出,如有疑问欢迎讨论。