从string中删除所有ANSI颜色/样式

我使用一个将ANSI颜色/样式添加到string的库。 例如:

> "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"白色和粗体的信息。

有一个string像'\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" 

也许一个好的正则expression式? 还是有内置function?


我在想的工作是创buildsubprocess:

 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); }); 

但是输出是一样的

应该使用的正则expression式是

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

这与绝大多数ANSI转义码匹配,不仅仅是颜色,还包括扩展的VT100代码,陈旧/专有的打印机代码等。

请注意,上面的正则expression式中的\u001b可能不适用于您的特定库(即使它应该)。 如果没有,可以查看我有关可接受的转义字符的类似问题的答案 。

如果你不喜欢正则expression式,你总是可以使用strip-ansi包。


例如,下面的stringjumpUpAndRed包含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); 

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

 /\u001b\[.*?m/g 

从而,

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