Удалите все цвета/стили 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, '')