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

Posted

技术标签:

【中文标题】ANSI 颜色转义序列字符出现在 String.length();【英文标题】:ANSI color escape sequence chars appearing inside String.length(); 【发布时间】:2020-09-29 16:05:09 【问题描述】:

当使用 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(" ");

    

输出: output

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

【问题讨论】:

【参考方案1】:

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

public static int getStringLengthWithoutANSI(String str) 
    return str.replaceAll("(\\x9B|\\x1B\\[)[0-?]*[ -\\/]*[@-~]", "").length();

【讨论】:

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

以上是关于ANSI 颜色转义序列字符出现在 String.length();的主要内容,如果未能解决你的问题,请参考以下文章

text BASH:为ANSI文本颜色转义序列设置变量

将 ANSI 转义(终端格式/颜色代码)转换为 HTML 的库 [关闭]

使用 PHP 将 ANSI 转义序列转换为 HTML

为啥ANSI颜色转义码不起作用[重复]

在 Python 中为具有 ANSI 颜色代码的字符串获取正确的字符串长度

[C#, 笔记] 启用虚拟终端处理 (使用 ANSI 转义序列前需启用)