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

Ion*_*zău 20 javascript regex ansi-escape node.js

使用一个库,将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'
Run Code Online (Sandbox Code Playgroud)

当我做:

console.log('\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m')
Run Code Online (Sandbox Code Playgroud)

一个"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"
Run Code Online (Sandbox Code Playgroud)

也许一个好的正则表达式?或者是否有任何内置功能?


我正在考虑的工作是创建子进程:

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);
 });
Run Code Online (Sandbox Code Playgroud)

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

Qix*_*Qix 41

应该使用正则表达式

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

这匹配大多数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);
Run Code Online (Sandbox Code Playgroud)

  • 完全披露:我是上述粉笔项目的维护者 (2认同)

hjp*_*r92 8

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

/\u001b\[.*?m/g
Run Code Online (Sandbox Code Playgroud)

从而,

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