Java ANSI颜色转义序列字符出现在String.length()中;

Java ANSI颜色转义序列字符出现在String.length()中;,java,string,escaping,ansi,color-codes,Java,String,Escaping,Ansi,Color Codes,当使用ANSI转义序列为字符串着色,然后获取所讨论字符串的.length()时,它不会给出字符串可见部分的长度,而是包含转义序列的一部分 import java.util.*; public class ColorTest { public static void main(String[] args){ String RED = "\u001B[31m"; String test = "Test";

当使用ANSI转义序列为字符串着色,然后获取所讨论字符串的.length()时,它不会给出字符串可见部分的长度,而是包含转义序列的一部分

import java.util.*;

public class ColorTest {
    public static void main(String[] args){
        String RED    = "\u001B[31m";
        String test = "Test";

        // Prints length with color
        System.out.println(test);
        System.out.println("Length: "+test.length());
        
        // Prints length with color
        test = RED+test;
        System.out.println(test);
        System.out.println("Length: "+test.length());

        // Prints every char found in the String
        char[] testCharList = test.toCharArray();
        for(char x : testCharList){
            System.out.print(x+" ");
        }
        System.out.println(" ");

    }
}
输出:


由于许多不同的颜色在转义序列中具有不同数量的数字(红色为31,亮红色背景为101),因此从字符串.length()数字中完全减去一个设置的数字是不可行的。我正在寻找一个通用的解决方案,它适用于所有颜色及其组合,其中只显示显示的字符串长度。

这不是一个非常理想的方法,但如果regex性能不是一个很大的问题,它应该可以工作

public static int getStringLengthwhithoutANSI(字符串str){
返回str.replaceAll(“(\\x9B|\\x1B\\\[)[0-?]*[-\\/]*[@-~]”,即“).length();
}

这不是一种非常理想的方法,但如果正则表达式性能不是一个很大的问题,它应该可以工作

public static int getStringLengthwhithoutANSI(字符串str){
返回str.replaceAll(“(\\x9B|\\x1B\\\[)[0-?]*[-\\/]*[@-~]”,即“).length();
}

我几个月前就不再需要解决这个问题了,但无论如何,谢谢你对这个老问题的回答!我的朋友,你致力于帮助那些需要帮助的人。是的,我自己也在寻找解决这个问题的方法。遇到了你的问题,没有其他的解决方法,所以我自己设计了一个。无论如何,我都会发布给未来有这个问题的人同样的问题。我几个月前就不再需要这个问题的解决方案了,但无论如何,谢谢你对这个老问题的回答!你,我的朋友,致力于帮助那些需要帮助的人。是的,我自己也在寻找这个问题的解决方案。遇到了你的问题,没有其他解决方案,所以我自己设计了一个。不管怎样,为那些有我也有同样的问题。