fix(exam): 扩展选项字母支持范围从A-D到A-Z
Some checks failed
continuous-integration/drone/push Build is failing

- 修复E选项及更多选项显示带前缀问题
- 更新所有选项相关正则表达式
This commit is contained in:
yuliang_guo
2026-01-28 14:09:46 +08:00
parent 55438b85c6
commit 12fd2fc0a1
3 changed files with 175 additions and 748 deletions

View File

@@ -349,21 +349,21 @@ const transformDifyQuestions = (difyQuestions: any[]): any[] => {
// 更精确地提取正确答案字母(避免误提取选项内容中的字母)
let correctLetters: string[] = []
// 情况1纯选项字母格式如 "A", "B", "A,B", "A、B", "A,B,C"
const pureLetterMatch = correctAnswerStr.match(/^[A-Da-d]([,、\s]+[A-Da-d])*$/)
// 情况1纯选项字母格式如 "A", "B", "A,B", "A、B", "A,B,C,D,E"
const pureLetterMatch = correctAnswerStr.match(/^[A-Za-z]([,、\s]+[A-Za-z])*$/)
if (pureLetterMatch) {
correctLetters = correctAnswerStr.match(/[A-Da-d]/g)?.map(l => l.toUpperCase()) || []
correctLetters = correctAnswerStr.match(/[A-Za-z]/g)?.map(l => l.toUpperCase()) || []
console.log(` ✓ 匹配情况1(纯字母): correctLetters=[${correctLetters.join(',')}]`)
} else {
// 情况2多选项带内容格式如 "A分组列,B聚合函数,C常量"
// 匹配所有 "X" 或 "X:" 格式,提取字母
const multiOptionMatch = correctAnswerStr.match(/[A-Da-d](?=[:])/g)
const multiOptionMatch = correctAnswerStr.match(/[A-Za-z](?=[:])/g)
if (multiOptionMatch && multiOptionMatch.length > 0) {
correctLetters = multiOptionMatch.map(l => l.toUpperCase())
console.log(` ✓ 匹配情况2(多选项带内容): correctLetters=[${correctLetters.join(',')}]`)
} else {
// 情况3只有开头字母如 "A" 后面直接跟非字母内容)
const firstLetterMatch = correctAnswerStr.match(/^([A-Da-d])(?![A-Za-z])/)
const firstLetterMatch = correctAnswerStr.match(/^([A-Za-z])(?![A-Za-z])/)
if (firstLetterMatch) {
correctLetters = [firstLetterMatch[1].toUpperCase()]
console.log(` ✓ 匹配情况3(开头字母): correctLetters=[${correctLetters.join(',')}]`)
@@ -410,8 +410,8 @@ const transformDifyQuestions = (difyQuestions: any[]): any[] => {
// 提取选项内容(去掉 "A" 或 "A:" 前缀)
let content = optStr
// 匹配 "Axxx" 或 "A:xxx" 格式(支持中英文冒号)
const contentPrefixMatch = optStr.match(/^[A-Da-d]\s*[:]\s*(.*)$/)
// 匹配 "Axxx" 或 "A:xxx" 格式(支持中英文冒号支持A-Z所有字母
const contentPrefixMatch = optStr.match(/^[A-Za-z]\s*[:]\s*(.*)$/)
if (contentPrefixMatch) {
content = contentPrefixMatch[1].trim()
}
@@ -422,13 +422,13 @@ const transformDifyQuestions = (difyQuestions: any[]): any[] => {
let letterSource = ''
// 1. 尝试从选项内容前缀提取(如 "Axxx" 或 "A:xxx"
const prefixMatch = optStr.match(/^([A-Da-d])\s*[:]/)
const prefixMatch = optStr.match(/^([A-Za-z])\s*[:]/)
if (prefixMatch) {
optionLetter = prefixMatch[1].toUpperCase()
letterSource = '内容前缀'
}
// 2. 尝试从 key 提取(如果 key 是单个字母 A-D
else if (key.match(/^[A-Da-d]$/)) {
// 2. 尝试从 key 提取(如果 key 是单个字母 A-Z
else if (key.match(/^[A-Za-z]$/)) {
optionLetter = key.toUpperCase()
letterSource = 'key字母'
}