如何在Discord Bot的代码块中正确实现GPT-4回复的换行?
解决方案
问题根源
你的代码存在两个核心问题导致换行失效:
- 正则过滤移除了换行符:当前的
replace正则表达式未包含换行符(\n),GPT返回的换行被全部删除,内容自然挤在一起。 - 代码块依赖有效换行符:你将回复放在代码块中,但过滤后的内容已无换行,代码块无法渲染出换行效果。
修复步骤
1. 修改正则表达式,保留换行符
调整过滤用的正则表达式,将\n加入允许的字符集合,确保GPT返回的换行被保留:
// 新增\n到允许的字符集合中 let responseFiltered = response.text.replace(/[^a-zA-ZěščřžýáíéďťňůúĚŠČŘŽÝÁÍÉĎŤŇŮÚ\?!,.0-9\\ \n-]/g, '');
2. 处理转义换行符(可选)
如果GPT返回的是转义后的\\n而非实际换行符,需先将其转换为真实换行:
// 在过滤前先处理转义的换行符 let responseText = response.text.replace(/\\n/g, '\n'); let responseFiltered = responseText.replace(/[^a-zA-ZěščřžýáíéďťňůúĚŠČŘŽÝÁÍÉĎŤŇŮÚ\?!,.0-9\\ \n-]/g, '');
3. 可选:切换为纯文本发送
若不需要代码块展示回复,可直接发送纯文本,Discord同样会识别\n渲染换行:
await message.channel.send({ content: `<@${message.author.id}>\n\n${chunk}` });
完整修改后的代码片段
response = await api.sendMessage("User has sent you a query to the roleplay. Respond without breaking character in terms of the roleplay as you were taught at the start. His query is: "+message.content, { parentMessageId: lastResponseId }).then(async (response) => { // add to user message history if (userMessageHistory.has(message.author.id)) { let userMessageHistoryArray = userMessageHistory.get(message.author.id); userMessageHistoryArray.push(response.id); userMessageHistory.set(message.author.id, userMessageHistoryArray); } else { let userMessageHistoryArray = []; userMessageHistoryArray.push(response.id); userMessageHistory.set(message.author.id, userMessageHistoryArray); } // 先处理转义换行,再调整正则保留换行 let responseText = response.text.replace(/\\n/g, '\n'); let responseFiltered = responseText.replace(/[^a-zA-ZěščřžýáíéďťňůúĚŠČŘŽÝÁÍÉĎŤŇŮÚ\?!,.0-9\\ \n-]/g, ''); const responseChunks = responseFiltered.match(/.{1,1800}/g) || [responseFiltered]; for (const chunk of responseChunks) { await message.channel.send({ content: `<@${message.author.id}>\n\n\`\`\`\n${chunk}\n\`\`\`` }); } await message.reactions.removeAll(); await message.react('<a:checkmark2:751058781156278382>') });
内容的提问来源于stack exchange,提问作者Megami
相关产品推荐
相关产品推荐

