从字符串中删除所有ANSI颜色/样式

时间:2014-08-11 14:28:43

标签: javascript regex node.js ansi-escape

use a library将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);
 });

但输出是一样的......

3 个答案:

答案 0 :(得分:37)

regex you should be using

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

这匹配大多数ANSI escape codes,不仅仅是颜色,包括扩展的VT100代码,古老的/专有的打印机代码等。

请注意,上述正则表达式中的\u001b可能不适用于您的特定库(即使它应该);查看my answer关于可接受的转义字符的类似问题,如果它没有。

如果您不喜欢正则表达式,则可以随时使用strip-ansi包。


例如,下面的字符串jumpUpAndRed包含用于跳转到上一行的ANSI代码,写入一些红色文本,然后返回到下一行的开头 - 其中需要的后缀不是{{1 }}

&#13;
&#13;
m
&#13;
&#13;
&#13;

答案 1 :(得分:8)

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

/\u001b\[.*?m/g

因此,

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

答案 2 :(得分:2)

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

其中 \u001bESC 字符, [^m]*?m 之前的任何字符(不是贪婪模式), m 本身,/g 用于全局(所有)替换。

示例:

MAX