如何按换行符分割文本?Discord音乐Bot歌词命令优化
问题
我正在开发一款Discord音乐机器人,写了个歌词查询命令,代码如下:
const { lyricsExtractor } = require('@discord-player/extractor'); const lyricsFinder = lyricsExtractor(); const result = await lyricsFinder.search(track.title); const lyrics = []; for (let i = 0; i < result.lyrics.length; i += 2000) { lyrics.push(result.lyrics.substring(i, i + 2000)); }
这段代码按每2000字符分割歌词(Discord单条消息字符上限),但会在一行中间截断歌词。我想实现仅按换行符分割,试了下面的代码但没生效:
for (let i = 0; i < result.lyrics.length; i += result.lyrics.lastIndexOf('\n', i + 2000) !== -1 ? result.lyrics.lastIndexOf('\n', i + 2000) % 2000 : 2000) { lyrics.push(result.lyrics.substring(i, result.lyrics.lastIndexOf('\n', i + 2000) !== -1 ? result.lyrics.lastIndexOf('\n', i + 2000) : i + 2000)); }
解决方案
核心是找到2000字符范围内的最后一个换行符作为分割点,确保不会截断整行。可以用更清晰的逻辑实现:
const { lyricsExtractor } = require('@discord-player/extractor'); const lyricsFinder = lyricsExtractor(); const result = await lyricsFinder.search(track.title); const lyrics = []; const maxMsgLength = 2000; let startPos = 0; while (startPos < result.lyrics.length) { // 先计算初始结束位置,再调整到最近的换行符 let endPos = startPos + maxMsgLength; if (endPos < result.lyrics.length) { endPos = result.lyrics.lastIndexOf('\n', endPos); // 极端情况:整段无换行,强制按2000字符分割 if (endPos === -1) endPos = startPos + maxMsgLength; } // 截取当前片段并加入数组 lyrics.push(result.lyrics.substring(startPos, endPos)); // 更新起始位置,跳过换行符本身 startPos = endPos + 1; }
逻辑说明
- 用
while循环替代for,适配动态变化的分割步长,逻辑更直观 - 每次先以
startPos + 2000为基准,向前找最近的换行符,保证分割在完整行末尾 - 处理无换行的极端场景,避免死循环
- 更新起始位置时加1,跳过换行符,防止下一段开头出现空行
内容的提问来源于stack exchange,提问作者Vegnar
相关产品推荐
相关产品推荐

