# 如何將大量選擇題匯入Anki - ft. 內專考題、RegExr、MDAnki
在內科醫學會我們可以找到已經整理好的[內專考題](http://www.tsim.org.tw/exam/exam108/q4.htm),可以用爬蟲全部抓下來,每一題大概會長這樣:
```
(B) 2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?
A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium
```
* 我們想把這些大量的題目,做成一張張[Anki](https://apps.ankiweb.net)的卡片,如下:
![](https://i.imgur.com/rZK1Nkm.png)
* 有人用node.js寫了一個[MDAnki](https://github.com/ashlinchak/mdanki)的套件,在Readme中,作者告訴大家只要在markdown中,以##做為開正面,用「%」分隔正反,就可以完成一張卡片。
```
## 正面用用兩個##作為標題
(正面的其他內容)
%
(背面)
```
* 所以,我們的目標是大量地把題目變成以下格式:
```
## 2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?
A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium
%
(C)
```
# 第一步:使用Regex整理題目
> 正規表示式(英語:Regular Expression,常簡寫為regex、regexp或RE),又稱正規表達式、正規表示法、規則運算式、常規表示法,是電腦科學的一個概念。正規表示式使用單個字串來描述、符合一系列符合某個句法規則的字串。在很多文字編輯器裡,正則表達式通常被用來檢索、替換那些符合某個模式的文字。
* 我們可以使用線上的[Regex編輯器](https://regexr.com),
* 或用VS code的尋找功能(第三個.*的按鈕) ![](https://i.imgur.com/bl4NWRO.png)
* 在hackmd中用Shift-Cmd-Option-F叫出尋找取代也可以
![](https://i.imgur.com/NbZnEyf.png)
## 再觀察一下題目的規則
```
(B) 2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?
A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium
```
* 我們可以發現,每一題的結構長這樣:
```
(答案)(一個縮排)(題號+題目)
(選項若干)
```
* 我們可以用以下的Regex語法把一個題目選出來,再來做重排
```
(\([A-E]\))(\t)(.+)((\n[A-E].+)*)
```
* 首先我們可以拆開看成四組小括號
* 第一組括號內的代表我們的答案:由一對小括號括起來的A~E大寫字母
```
\([A-E]\) 其中:
\(代表左括號,加反斜線是因為左括號是保留符號,不加的話會被當成另一組Regex中的群組
[A-E]代表A-E的大寫字母,用中括號括起來
\)代表右括號,同理
```
> ==(B)== 2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?
A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium
* 第二組代表縮排tab
```
\t
```
> (B)==(這裡有個看不見的tab)== 2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?
A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium
* 第三組代表一串字,即題目
```
.代表任意的字元
+代表任意的數字,如果沒有+的話,就只會搜到一個字
```
> (B) ==2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?==
A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium
* 第四組代表我們的選項
```
\n代表分行符號
[A-E]代表用A-E開始的每行
.+一樣是不限字數的一串字元
然後把上述括起來後加一個*號,代表比對多次,直到不符為止
```
> (B) 2. 高血壓的病人初次就醫時,應安排優先做以下評估(initial evaluation),何者除外?
==A. Hematocrit
B. Serum uric acid level
C. ECG (electrocardiogram)
D. Urinalysis 或 urine albumin excretion
E. Serum BUN and Cr, Sodium, potassium==
# 第二步:取代並重排
* 我們要把上述選出來的四組規則變成:
```
## (題目:第三組)
(選項若干:第四組)
%
(答案:第一組)
```
* 在 https://regexr.com 開啟Replace功能
![](https://i.imgur.com/3SdMlQY.png)
* VS Code則用
![](https://i.imgur.com/hnbo8wh.png)
* 在Regrex中,以$+數字來表示第幾組,所以要重排並加入符號:
```
## $3$4%$1
```
* 會得到以下結果:
```
## 1. 慢性腎臟病(CKD)病人常合併有鈣磷異常,以下有關治療的敘述,何者錯誤?
A. 採用低磷飲食(low phosphate diet),有助於預防副甲狀腺高能症(secondary hyperparathyroidism)
B. 使用活性維他命D(如: calcitriol)可以抑制副甲狀腺素(parathyroid hormone)分泌,副作用之一是引起高血鈣(hypercalcemia)
C. 使用calcimimetic agent(如: cinacalcet)可以抑制副甲狀腺素(parathyroid hormone)分泌,副作用之一是引起高血鈣(hypercalcemia)
D. 使用磷結合劑(如: 各式鈣片)可以抑制副甲狀腺素(parathyroid hormone)分泌,副作用之一是引起高血鈣(hypercalcemia)
E. 使用sevelamer或lanthanum,可以抑制腸胃道對磷的吸收,但不會引起高血鈣(hypercalcemia)%(C)
```
* %跟選項沒有分行,所以我們要加入一些分行符號\n
```
## $3$4\n%\n$1\n
```
* 完成
```
## 1. 慢性腎臟病(CKD)病人常合併有鈣磷異常,以下有關治療的敘述,何者錯誤?
A. 採用低磷飲食(low phosphate diet),有助於預防副甲狀腺高能症(secondary hyperparathyroidism)
B. 使用活性維他命D(如: calcitriol)可以抑制副甲狀腺素(parathyroid hormone)分泌,副作用之一是引起高血鈣(hypercalcemia)
C. 使用calcimimetic agent(如: cinacalcet)可以抑制副甲狀腺素(parathyroid hormone)分泌,副作用之一是引起高血鈣(hypercalcemia)
D. 使用磷結合劑(如: 各式鈣片)可以抑制副甲狀腺素(parathyroid hormone)分泌,副作用之一是引起高血鈣(hypercalcemia)
E. 使用sevelamer或lanthanum,可以抑制腸胃道對磷的吸收,但不會引起高血鈣(hypercalcemia)
%
(C)
```
* 實際操作圖片
![](https://i.imgur.com/4eSkAtl.png)
* 接著把批量處理完的檔案存成.md檔,丟到自己指定的位置
# 使用MDAnki套件
* 安裝[Node.js](https://nodejs.org/en/)
* 安裝好後,在終端機輸入:
```
npm install -g mdanki
```
* 如果出現 Error: EACCES: permission denied,可能是權限問題,請輸入下列指令:
```
sudo chown -R 使用者名稱 ~/.npm
(這裡會要你打密碼)
sudo chown -R 使用者名稱 /usr/local/lib/node_modules
```
* 最後輸入指令
```
mdanki 你的檔案.md 牌組名稱.apkg
```
![](https://i.imgur.com/0OpWoCJ.png)
# 完成
* 點擊我們的排組:
![](https://i.imgur.com/Jjflr2m.png)
* 匯入
![](https://i.imgur.com/yLGCCLo.png)
* 開始學習
![](https://i.imgur.com/Vo0HMzO.png)
* 範例:[腎專五年考題.apkg](https://www.dropbox.com/s/f0hgso6r5jkik4f/%E8%85%8E%E5%B0%88%E4%BA%94%E5%B9%B4%E5%85%A7%E8%80%83%E9%A1%8C.apkg?dl=0)