Удалите все цвета/стили ANSI из строк

I используйте библиотеку, которая добавляет цвета/стили ANSI к строкам. Например:

> "Hello World".rgb(255, 255, 255)
'\u001b[38;5;231mHello World\u001b[0m'
> "Hello World".rgb(255, 255, 255).bold()
'\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m'

Когда я это сделаю:

console.log('\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m')
Появится сообщение

a "Hello World" белого и полужирного.

Имея строку типа '\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m', как удалить эти элементы?

foo('\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m') //=> "Hello World"

Может быть, хорошее регулярное выражение? Или есть встроенная функция?


Работа, о которой я думал, заключалась в создании дочернего процесса:

require("child_process")
 .exec("node -pe \"console.error('\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m')\""
 , function (err, stderr, stdout) { console.log(stdout);
 });

Но результат тот же...

Ответы

Ответ 1

Регулярное выражение , которое вы должны использовать,

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

Это соответствует большинству ANSI escape-кодов, помимо только цветов, включая расширенные коды VT100, архаичные/проприетарные коды принтера и т.д.

Обратите внимание, что \u001b в приведенном выше регулярном выражении может не работать для вашей конкретной библиотеки (даже если это необходимо); проверьте мой ответ на аналогичный вопрос относительно приемлемых символов эвакуации, если это не так.

Если вам не нравятся регулярные выражения, вы всегда можете использовать пакет strip-ansi.


Например, строка jumpUpAndRed ниже содержит коды ANSI для перехода к предыдущей строке, написание красного текста, а затем возврат к началу следующей строки, для которых требуются суффиксы, отличные от m.

var jumpUpAndRed = "\x1b[F\x1b[31;1mHello, there!\x1b[m\x1b[E";
var justText = jumpUpAndRed.replace(
  /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
console.log(justText);

Ответ 2

Эквивалентный символ \u001b, и последовательность из [ до первого m встречается в стиле. Вам просто нужно удалить это. Итак, замените глобально, используя следующий шаблон:

/\u001b\[.*?m/g

Таким образом,

'\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m'.replace(/\u001b\[.*?m/g, '')