Supprimer toutes les couleurs/styles ANSI des cordes

I utiliser une bibliothèque qui ajoute des couleurs / styles ANSI aux cordes. Par exemple:

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

Quand je fais:

console.log('u001b[1mu001b[38;5;231mHello Worldu001b[0mu001b[22m')

"Hello World" les messages blancs et gras seront affichés.

ayant une chaîne comme 'u001b[1mu001b[38;5;231mHello Worldu001b[0mu001b[22m' comment ces éléments-elle être retirée?

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

peut-être une bonne expression régulière? Ou est-il intégré?


le travail autour de je pensais était de créer enfant processus:

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

mais la sortie est la même...

15
demandé sur Antti Haapala 2014-08-11 18:28:42

2 réponses

regex vous devrait utiliser

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

cela correspond à la plupart des échappement ANSI codes, au-delà des couleurs, y compris la prolongation de VT100 codes, archaïque/propriétaire de l'imprimante de codes, etc.

notez que le \u001b dans le ci-dessus regex peut ne pas fonctionner pour votre bibliothèque (même si elle devrait); découvrez ma réponse à une question similaire concernant les caractères d'échappement acceptables si elle ne fait pas.

Si vous n'aimez pas les regexes, vous pouvez toujours utiliser le strip-ansi package.


Par exemple, la chaîne jumpUpAndRed ci - dessous contient les codes ANSI pour sauter à la ligne précédente, écrire du texte rouge, puis revenir au début de la ligne suivante-de ce qui nécessitent des suffixes autres que 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);
30
répondu Qix 2017-05-23 11:54:51

Le caractère d'échappement est \u001b, et la séquence [ jusqu'à la première m est rencontré est le style. Vous avez juste besoin de l'enlever. Ainsi, remplacer globalement en utilisant le modèle suivant:

/\u001b\[.*?m/g

ainsi,

'\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m'.replace(/\u001b\[.*?m/g, '')
6
répondu hjpotter92 2014-08-11 14:56:12