根據業務需求,需要有乙個批量新增題目的功能。
如上圖所示,左邊是純文字輸入的題目,右邊需要解析成乙個個對應的題目。
右邊的題目就是乙個元件,根據不同的型別進行顯示,這個元件這裡不做談論。這裡要做的就是根據左邊的文字內容,解析成乙個個物件的形式,傳入右邊的元件進行渲染。
這篇文章,就是如何把左邊的純文字,解析成乙個個的物件,這就考驗文字的拆分能力了。
第一步當然是指定規則,不然沒法知道以什麼的方式進行解析。
這裡為了方便處理,對每個題目型別的格式加以限定,每個題目之間也用空行進行分隔。
1、每個題目之間必須以空行分割,題幹中間不得換行。
2、所有題型必須含有 「答案:」字段,且不能為空。
3、【選擇題】最多支援10個選項a,b,c,d,e,f,g,h,i,j,且必須按順序輸入。
4、【選擇題】選項號a-h與內容之間必須用 」、「 或 」.「 分隔開。
5、【選擇題】答案中不能加空格。
6、【判斷題】答案僅支援 「正確」,「錯誤」 或者 「對」,「錯」。
7、【填空題】每個空使用至少三個短下劃線 「___」 作為空的位置。
8、【填空題】多個填空的答案用 「|」 分割。每個填空有多個答案的話用 「&&」 分隔。單個答案不用新增。
9、【填空題】答案如果多於題目中需要填空的個數,多於的答案將被忽略。
10、【問答題】的答案可以為空。
11、【檔案上傳題】的答案必須為 「[檔案]」 。
下一步就是拆分每個題目。
以為核心就是一句正規表示式/\n\s*\n\s*/g
,所以直接上**:
// 將批量題目分成乙個個題目字串
function geteachsub(whole) );}}
題目的型別總共分為:
每個題目的物件為:
解析的思路:
答案對了,判斷題型
否則具體的**如下:
// 將乙個個題目字串拆解/組合成題目物件
function assemblesub(eachsub) ;
let ansarr = eachsub.match(/\n\s*答案[::]/g);
if(ansarr) else else if(sourcetimuarr.length > 11)
let valarr = ;
sourcetimuarr.map((item,i)=> else ;
subobj.items.push(obj);
valarr.push(obj.val);
}});
// 單選題
if(subobj.answer.length === 1)
} else }}
} else
}else /g).length;
let fillinans = regarr[1].split(/\s*\|\s*/g);
if(len>0 && len <= fillinans.length) )
});} else );}}
} else
}/**
* 判斷題
*/else if(regarr[1].trim() === '對'
|| regarr[1].trim() === '錯'
|| regarr[1].trim() ==='正確'
|| regarr[1].trim() ==='錯誤')
/*** 檔案上傳題
*/else if(regarr[1].trim() === '[檔案]')
/*** 問答題
*/else }}
} else
return subobj;
}
批量新增題目功能(正規表示式的使用案例)
根據業務需求,需要有乙個批量新增題目的功能。如上圖所示,左邊是純文字輸入的題目,右邊需要解析成乙個個對應的題目。右邊的題目就是乙個元件,根據不同的型別進行顯示,這個元件這裡不做談論。這裡要做的就是根據左邊的文字內容,解析成乙個個物件的形式,傳入右邊的元件進行渲染。這篇文章,就是如何把左邊的純文字,解...
正規表示式類題目
例如 numsplit 1234567.1234 結果 1,234,567.1234實現 function numsplit num var n 1234567.1234 console.log numsplit n 解析 斷言部分 拆分正則 d 斷言 匹配後面不是數字的字元 d 匹配數字個數是3的...
正規表示式功能1
正規表示式 符合一定規則的表示式。作用 用於專門操作字串。特點 用於一些特定的符號來表示一些 操作。這樣就簡化書寫 所以學習正規表示式,就是在學習一些特殊符號的使用。好處 可以簡化對字串的複雜操作 弊端 符號定義越多,正則越長,閱讀性越差 具體操作功能 1,匹配 string matches方法。用...