使用js正则表达式实现类似问卷星文本导入问题。这里只是实现最基础的解析,没有考虑异常情况的处理。
文本内容
<textarea id="txt">
1、我国的火警报警电话是(C)?[单选题](分值:5分)
A、110
B、120
C、119
D、911
2、四大文明古国中的,四大文明是下列选项中的哪四个(ABCE)?[多选题](分值:10分)
A、埃及文明
B、印度文明
C、中国文明
D、希腊文明
E、美索不达米亚文明
3、《出师表》中,“先帝創業未半,而中道崩殂“中的”先帝“是指刘备。(对)[判断题](分值:5分)
4、《史记》的作者是?[填空题]
</textarea>
将文本解析为question对象
/**
* 文本切割成问题块
*/
function getBlocks() {
const text = document.getElementById('txt').innerHTML
const paragraphs = text.split(/\n\s*\n/);
return paragraphs
}
/**
* @param {Object} txt 内容转换成question对象
*/
function getQuestion(txt) {
const question = {
selections: []
}
const lines = txt.split(/\r?\n/);
for (let idx in lines) {
const line = lines[idx].replace(/\s/g, '')
if (idx == 0) {
question.type = getQuestionType(line)
question.title = getTitle(line)
question.answer = getAnswer(line)
question.score = getScore(line)
} else if (line) {
question.selections.push(line)
}
}
// console.log(question)
return question
}
/**
* 提取问题类型
* @param {Object} text
*/
function getQuestionType(text) {
const regex = /\[(.*?)\]/g;
const matches = text.match(regex);
return matches ? matches[0]?.replace(/\s/g, '').replace(/\[|\]/g, '') : ''
}
/**
* 提取题目
* @param {Object} text
*/
function getTitle(text) {
const type = /\[(.*?)\]/g;
const answer = /\((.*?)\)|((.*?))/g;
const title = text.replace(type, '').replace(answer, '');
return title
}
/**
* 提取答案
* @param {Object} text
*/
function getAnswer(text) {
const regex = /\(([^分].*?)\)|(([^分].*?))/g;
let matches = text.match(regex);
return matches ? matches[0]?.replace(/\s/g, '').replace(/\(|\)/g, '').replace(/(|)/g, '') : ''
}
/**
* 提取分值
* @param {Object} text
*/
function getScore(text) {
const regex = /\((分值:.*?)\)|((分值:.*?))/g;
let matches = text.match(regex)
const scores = matches ? matches[0]?.match(/[0-9]+/g) : null
return scores ? scores[0] : ''
}
const paragraphs = getBlocks()
const questions = []
for (let idx in paragraphs) {
const txt = paragraphs[idx]
const q = getQuestion(txt)
questions.push(q)
}
console.log(questions)
执行效果: