You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按换行符分割文本?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:12:15