36

使用一个将 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);
 });

但是输出是一样的...

4

3 回答 3

76

应该使用的正则表达式是

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

这匹配大多数ANSI 转义码,不仅仅是颜色,包括扩展的 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);

于 2015-04-07T17:37:20.013 回答
13

转义字符是,并且遇到从到 first\u001b的序列是样式。你只需要删除它。因此,使用以下模式进行全局替换:[m

/\u001b\[.*?m/g

因此,

'\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m'.replace(/\u001b\[.*?m/g, '')
于 2014-08-11T14:34:30.063 回答
3

颜色就像ESC[39m格式,最短的正则表达式是/\u001b[^m]*?m/g

\u001b是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 )
于 2021-02-03T09:06:41.897 回答