如何在Javascript中删除/替换字符串中的ANSI颜色代码

ebdffaop  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(153)

我发现下面的函数有问题。第一个参数是一个包含ANSI颜色代码的字符串,第二个参数是布尔值。
如果布尔值设置为false,则会完全删除字符串。
如果布尔值设置为true,则循环会将每个颜色代码转换为更容易解析的代码。
我怀疑RegExp是问题所在,因为它在1; 33和0;31出于某种原因。

var colorReplace = function( input, replace ) {
        var replaceColors = {
            "0;31" : "{r",
            "1;31" : "{R",

            "0;32" : "{g",
            "1;32" : "{G",

            "0;33" : "{y",
            "1;33" : "{Y",

            "0;34" : "{b",
            "1;34" : "{B",

            "0;35" : "{m",
            "1;35" : "{M",

            "0;36" : "{c",
            "1;36" : "{C",

            "0;37" : "{w",
            "1;37" : "{W",

            "1;30" : "{*",

            "0" : "{x"
        };

        if ( replace )
        {
            for( k in replaceColors )
            {
                //console.log( "\033\[" + k + "m" + replaceColors[ k ] );
                var re = new RegExp( "\033\[[" + k + "]*m", "g" );

                input = input.replace( re, replaceColors[ k ] );
            }
        } else {
            input = input.replace( /\033\[[0-9;]*m/g, "" );
        }

        return input;
    };

console.log( "abcd\033[1;32mefgh\033[1;33mijkl\033[0m" );
console.log( colorReplace( "abcd\033[1;32mefgh\033[1;33mijkl", true ) );

实际输出为:

应该是abcd{Gefgh{Yijkl的位置
有人知道出什么事了吗?

fzsnzjdm

fzsnzjdm1#

可以在字符串和RegExps中使用八进制代码

x = "\033[1mHello Bold World!\033[0m\n";
x = x.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,"");
print(x);

这与大多数ANSI escape codes匹配,包括扩展的VT 100代码、过时/专有打印机代码等。

zzlelutf

zzlelutf2#

你的正则表达式是错误的。它应该是"\\033\\[" + k + "m",而不是"\033\[[" + k + "]*m"

相关问题