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

Я использую библиотеку, которая добавляет к строкам цвета и стили 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')

будет выведено "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);
 });

Но выход тот же...


person Ionică Bizău    schedule 11.08.2014    source источник
comment
Вы должны использовать мел. Он проверяет, включены ли цвета или нет, и автоматически удаляет коды ANSI из вашего текста.   -  person Qix - MONICA WAS MISTREATED    schedule 30.06.2015
comment
@Qix Дело не в стиле, а в отмене стиля - удалении стилей ANSI из строк. Для раскрашивания я использую couleurs, а для удаления стиля я использую ansi-parser. Надеюсь, теперь стало понятнее.   -  person Ionică Bizău    schedule 01.07.2015
comment
I use a library that adds ANSI colors / styles to strings И я говорю, что используя мел, вы можете удалить эти коды автоматически, если вы того пожелаете (т.е. вы можете стилизовать и автоматически удалить).   -  person Qix - MONICA WAS MISTREATED    schedule 01.07.2015
comment
@Qix А, понял. Я думал, что chalk только для раскрашивания. Насколько я вижу, для этого используется strip-ansi, и вы являетесь одним из участников. :-) Хороший!   -  person Ionică Bizău    schedule 01.07.2015
comment
Я сейчас; не было, когда я первоначально разместил ха-ха. Вернулся, чтобы обновить регулярное выражение тем, которое я написал для ansi-regex.   -  person Qix - MONICA WAS MISTREATED    schedule 01.07.2015
comment
@Qix Вы можете обновить свой ответ, включая пакет strip-ansi. Мне всегда нравились крошечные и симпатичные пакеты npm. :)   -  person Ionică Bizău    schedule 01.07.2015


Ответы (3)


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

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

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

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

Если вам не нравятся регулярные выражения, вы всегда можете использовать пакет 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);

person Qix - MONICA WAS MISTREATED    schedule 07.04.2015
comment
Полное раскрытие: я поддерживаю меловые проекты, упомянутые выше. - person Qix - MONICA WAS MISTREATED; 01.07.2015

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

/\u001b\[.*?m/g

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

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

Цвета аналогичны формату ESC[39m, самое короткое регулярное выражение для него — /[^m]*?m/g

Где  – символ ESC, [^m]*? – любые символы до m. (не жадный шаблон), сам m и /g для глобальной (всей) замены.

Пример:

    var line="\x1B[90m2021-02-03 09:35:50.323\x1B[39m\t\x1B[97mFinding: \x1B[39m\x1B[97m»\x1B[39m\x1B[33m42125121242\x1B[39m\x1B[97m«\x1B[39m\x1B[0m\x1B[0m\t\x1B[92mOK\x1B[39m";
    
    console.log(line.replace(/\u001b[^m]*?m/g,""));
// ->  2021-02-03 09:35:50.323 Finding: »42125121242«  OK ( without colors )
    console.log(line);
// -> 2021-02-03 09:35:50.323 Finding: »42125121242«  OK ( colored )
person Sándor Krisztián    schedule 03.02.2021