製作 HTML5 FUN 遊戲時,如果能利用現有的題庫當基礎,應該會快很多。以前我會使用教科書商提供的命題光,將題庫輸出成 CSV 格式;如果是自己出的考卷文件檔案,則必須多一道工去解析出題幹、選項、答案,早期都是用 perl、PHP,主要是它們都可以在找出題目字串的規則以後,使用 Regular Expression (regex) ,將規則套進去,進行字串的解析、分解、置換。只要規則設對了,簡單而有效率。在 Google 試算表的主選單 [資料] 中,有一個 [將文字分隔成不同欄] ,如果是簡單的將字串分欄,可以玩玩,但是複雜一點的,就得用別的方法了。Google 試算表也有提供 Regular Expression 相關的公式可供運用,底下的試算表中,記錄幾個由網路中找到的試卷,試著將其中的題目解析出題庫及選項。
- https://docs.google.com/spreadsheets/d/1p-YOPBJeHbobA83eC3SZPmMCqQu9-V1pYwH9Hy0t8lE/edit?usp=sharing
先來看看使用了哪些 Google 試算表的公式:
- CONCATENATE :將指定的範圍的多個內容合成一個字串。當我們將考卷中的題目貼到試算中,如果一題被分成多行時,就需要使用這個公式來將全部的題目先合成單行,再找出分離各題的規則,使用 REGEXREPLACE 和 SPLIT 來重新分開各題。
- REGEXREPLACE: 將符合規則的字串,置換為新字串。在本篇中,主是用來將題目的開頭(題號、括號...)或是選項的符號,置換為一個題目中不太會使用到的特殊符號(♥),方便之後以這個特殊符號來分離題目,或是題目的各個選項。
- SPLIT:以指定的字,將字串分解後,往右填入各儲存格。主要是用來分離題目,及題目中的各個選項。
- TRANSPOSE:將由左往右的結果,變成由上往下。主要應用在將題庫分離時,因為使用 SPLIT 處理後是由左往右(橫向)的結果,而我們需要的是由上往下填入各行,所以利用 TRANSPOSE 來轉換填入儲存格的方向。
- ARRAYFORMULA:公式套到多行或陣列。這個公式可以讓我們不用去設區塊選取,不用一直按 Ctrl + Enter。
- REGEXEXTRACT:以規則找出指定的內容。主要應用在找出正確答案。
考卷的題目的文字基本上有規則可循,所以我們可以利用 Regular Expression 來解析,底下介紹一些簡單的規則語法:
- 保留字,因為 Regular Expression 會使用一些符號,如果題目中有這些符號,我們就必須在前面多加一個反斜線,例如括號和點:
- \(
- \)
- \.
- 數字:
- \d
- \d+
- \d*
- [0-9]
- [1-4]
- 英文字母
- [a-z]
- [A-Z]
- [A-D]
- 空白字元(包括空格、跳格、換行......)
- \s
- \s+
- \s*
- 代表數量的符號
- + : 一次以上
- * : 零次以上
- {1} : 一次
- {3} : 三次
- 或
- |
像選擇題的開頭,一般會用「( )1.」、「( )2.」、「( )3.」這種括號中有空格供填答,再加題號的格式,Regular Expression 規則就這樣設:
- \(\s+\)\s*\d+\.
解譯一下:「左括號」「空格一個以上」「右括號」「空格零個以上」「數字一個以上」「一個點」。
如果題號、點是放在前面,就改成:
- \d+\.\s*\(\s+\)
解譯一下:「數字一個以上」「一個點」「空格零個以上」「左括號」「空格一個以上」「右括號」。
如果多題題目已合為單行字串時,我們要找出所有符合的,就將前面的規則用括號包起來,變成:
- (\(\s+\)\s*\d+\.)
- (\d+\.\s*\(\s+\))
同樣的原理,要找出選擇題的各個選項的話,假設選項是用 (A)...(B)...(C)...(D),那就用這樣的規則:
- \([A-D]\)
這裡用了 [A-D] 表示 ABCD 都符合規則。
因為選項不會只有一個,所以記得要用括號包起來,才能找出所有一樣規則的選項:
- (\([A-D]\))
不過似乎有的人會使用全形的字母,那只好改為:
- (\([ABCD]\))
- ○1...○2...○3...○4
數字的部份一定要看清楚,如果是半形的,可以用「\d」,但如果是全形字,就得一個個列出來了,像前例中的數字即是全形的,可以用這樣的規則:
- (○[1234])
如果是半形的數字,就可以用:
- (○\d) 或是 (○[1-4])
先留個記錄,有空再補充。實際的應用都在本文最前面的試算表中了,按一下儲存格即可看到用了什麼公式組合。
沒有留言:
張貼留言