【问题标题】:Replace \t (tab) in string with number of spaces tab contains in Java将字符串中的 \t(制表符)替换为 Java 中制表符包含的空格数
【发布时间】:2021-07-30 09:53:59
【问题描述】:

我有一个包含字符串的 XML 标签,例如

<Narrative>I am String       with tab</Narrative>

当我们读取这个 XML 并将其存储在 Java 变量中时,它会转换为如下所示

String narrativeText = "I am String \t with tab"; 

我们希望将 \t 替换为制表符包含的空格数,因为如果在字符串中接收到 \t,我们的终端系统会抛出异常。

java 将多少个空格视为制表符?

附:我不想使用 String 类的 replacereplaceAll 方法通过空白字符删除 \t,因为我想包含 \t char 包含的空格数。

声纳插件发出警告:从此文字中删除未转义的 \u0009 字符。

【问题讨论】:

  • 如何用空格数替换那个选项卡?

标签: java xml string xml-parsing


【解决方案1】:

Java 对制表符没有任何特殊意义。

传统上,打印机移至下一列,即八的倍数(8、16、24 等)。

我建议从您的旧字符串逐个字符地构建一个新字符串,其中制表符通过在新字符串的长度上添加空格来处理是 8 的倍数。

【讨论】:

  • 声纳插件发出警告:文字中的空格和控制字符应该是明确的
  • 声纳手册对这个警告有解释吗?
  • 8 个制表符源于 80 个字符、8 英寸、复制到 ADM3A 终端的打字机时代。固定大小的屏幕字体。
【解决方案2】:

我认为你有些困惑。 Tab 实际上并不是您的想法。 \t 不等同于空格(尽管有时会考虑)。 Tab实际上意味着标签的下一个停止。 tab的停顿多在48的倍数区间后。

观看此内容以获得更好的参考:https://stackoverflow.com/a/13094734/15862198

【讨论】:

    【解决方案3】:

    如果你想要一个有 4 个空格的制表符:

    "\ty"    -> "    y"  4 spaces
    "x\ty"   -> "x   y"  3 spaces
    "xx\ty"  -> "xx  y"  2 spaces
    "xxx\ty" -> "xxx y"  1 space
    

    所以你需要一点编程,最好用java而不是XML来完成。 (在 XSLT 的情况下,您还可以在 XML 中调用 java 函数。)

    由于制表符通常用于简单的等宽脚本,因此代码进行了简化,在字符中使用 length(),并且不考虑组合变音符号和其他零或双倍长度代码点。

    public static String untab(String s, int tabSize) {
        if (tabSize <= 0) {
            return s.replace("\t", "");
        }
        StringBuilder sb = new StringBuilder();
        s.codePoints().forEach(cp -> {
            if (cp == '\t') {
                do {
                    sb.append(' ');
                } while ((sb.length() % tabSize) != 0);
            } else {
                sb.appendCodePoint(cp);
            }
            // Or: sb.append(" ".repeat(tabSize - (sb.length() % tabSize)));
        });
        return sb.toString();
    }
    

    完全正确的版本最好与 font 渲染 i.o 一起使用。 length().

    【讨论】:

    • 到底要在 tabSize 中传递什么?
    • 所以这个方法和narrativeText = NarrativeText .replaceAll("\t", " ");如果我们考虑 tabsize = 1
    • 没有人使用 tabsize 1
    • @PawanPatil tabSize 1 确实会用一个空格替换选项卡。这也是一种方法,例如,如果文本用于普通 HTML。
    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多