如何将带编号的问答字符串转为含question/answer的对象数组?
当然可以用split()方法实现!结合正则表达式就能轻松搞定这个需求,我给你一步步拆解怎么做:
核心思路
我们需要分两步拆分:
- 先把整个字符串按
(1)、(2)这类编号开头的规则拆分成独立的问答块; - 再把每个问答块拆成问题和答案两部分,最后组装成目标对象数组。
具体实现代码
const string = "(1) blah blah blah ANSWER: bling (2) bleh bleh bleh ANSWER: bleng"; // 第一步:拆分出每个独立的问答单元 // 用正向预查正则,确保在"(数字)"前面的位置拆分,不会丢失编号 const questionChunks = string.split(/(?=\(\d+\))/).filter(chunk => chunk.trim() !== ''); // 第二步:将每个问答单元转换为对象 const resultArray = questionChunks.map(chunk => { // 按" ANSWER:"拆分问题和答案部分(注意前面的空格,避免误匹配内容里的ANSWER) const [questionText, answerText] = chunk.split(/\sANSWER:/); return { question: questionText.trim(), answer: `ANSWER: ${answerText.trim()}` }; }); console.log(resultArray); // 输出结果就是你要的对象数组: // [ // { question: "(1) blah blah blah", answer: "ANSWER: bling" }, // { question: "(2) bleh bleh bleh", answer: "ANSWER: bleng" } // ]
关键细节解释
- 拆分问答块的正则
/(?=\(\d+\))/:这里用了正向预查((?=...)),它会匹配后面紧跟着(数字)的位置,但不会消耗这些字符。这样拆分出来的每个chunk都会完整保留(1)、(2)这类编号开头,不会像直接用split("(")那样把编号拆碎。 - 过滤空字符串:
filter(chunk => chunk.trim() !== '')是为了处理原始字符串开头可能出现的空元素(比如如果字符串开头刚好是拆分位置的话)。 - 拆分问题和答案:用
/\sANSWER:/作为分隔符,确保只拆分作为答案标识的ANSWER:(前面带空格),避免误拆问题内容里可能出现的ANSWER字样。拆分后记得补回ANSWER:前缀,因为split()会把分隔符本身去掉。
如果你的实际场景里ANSWER:前面可能没有空格,只要把拆分正则改成/(?=ANSWER:)/就可以了,灵活调整就行~
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

