Очистить текст от символов для терминала

Рейтинг: 0Ответов: 1Опубликовано: 31.07.2025

Я использую такой код:

const { spawn } = require("node-pty")
aiProcess = spawn("ollama", [
    "run",
    process.env.AI_NAME,
    message.content,
    "--nowordwrap",
])

let reply = ""

aiProcess.onData(async (text) => {
    console.log(text)
    reply += text.trim()
})

aiProcess.onExit(async () => {
    console.log(reply)
    await message.reply(reply)
})

qwen2.5 генерирует ответ, он выводится в консоль. Но при отправке (в данном случае в дискорд) в тексте оказывается много символов, которые скорее всего предназначены для терминала и не должны быть видны.

То есть:

Нормально, а у тебя как :cool:?

Превращается в

[?2026h[?25l[1G⠙ [K[?25h[?2026l[?2026h[?25l[1G⠹ [K[?25h[?2026l[?25l[?2026h[?25l[1G[K[?25h[?2026l[2K[1G[?25hН[?25l[?25hорм[?25l[?25hально[?25l[?25h,[?25l[?25h а[?25l[?25h у[?25l[?25h тебя[?25l[?25h как[?25l[?25h :[?25l[?25hcool[?25l[?25h:?[?25l[?25h[?25l[?25h

Я пробовал:

  • reply.replace(/[^A-Za-zА-Яа-яЁё\s\p{P}\d=+|^]/, "")
  • reply.normalize()

Оба способа не дали заметного результата

Ответы

▲ 0Принят

Это анси шняга, она не так работает как ты думаешь, вот реальная регулярка::

/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g

https://stackoverflow.com/a/29497680

Взял отсюда ибо я лентяй чутка. Там еще пэкэдж рекомендуется самим же автором strip-ansi