web-dev-qa-db-ja.com

文字列からすべてのANSIカラー/スタイルを削除します

I ライブラリを使用 文字列に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);
 });

しかし、出力は同じです...

24
Ionică Bizău

regex youshouldbe using is

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

これは、拡張VT100コード、古風な/独自のプリンタコードなど、色だけでなく、ほとんどの ANSIエスケープコード に一致します。

上記の正規表現の_\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);_

エスケープ文字は\u001bであり、[から最初のmに遭遇するまでのシーケンスがスタイリングです。あなたはそれを取り除く必要があります。したがって、次のパターンを使用してグローバルに置き換えます。

/\u001b\[.*?m/g

したがって、

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