首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >展开Java中的选项卡

展开Java中的选项卡
EN

Stack Overflow用户
提问于 2012-07-30 21:45:49
回答 4查看 1.2K关注 0票数 4

您是否知道将文本中的字符扩展为空格的java方法?

我的文本:

1. <tab>  firstpoint  <tab> page  1
10. <tab> secondpoint <tab> page 10

如果我直接将制表符替换为,比方说,4个空格,我将拥有

1.    firstpoint    page1
10.    secondpoint    page2

取而代之的是,我需要一种方法来将每个制表符替换为它实际对应的空格数量(就像vim的retab命令所做的那样)。有什么解决方案吗?

EN

回答 4

Stack Overflow用户

发布于 2016-01-22 04:18:37

我认为上面的retab()函数忽略了初始制表符,可能有问题。我做了我自己的;在此被放入公共领域。

public static String expandTabs(String s, int tabSize) {
    if (s == null) return null;
    StringBuilder buf = new StringBuilder();
    int col = 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        switch (c) {
            case '\n' :
                col = 0;
                buf.append(c);
                break;
            case '\t' :
                buf.append(spaces(tabSize - col % tabSize));
                col += tabSize - col % tabSize;
                break;
            default :
                col++;
                buf.append(c);
                break;
        }
    }
    return buf.toString();
}

public static String spaces(int n) {
    StringBuilder buf = new StringBuilder();
    for (int sp = 0; sp < n; sp++) buf.append(" ");
    return buf.toString();
}
票数 5
EN

Stack Overflow用户

发布于 2012-07-30 22:48:22

我在web上没有找到任何实现,所以我自己写了它,基于biziclop的想法:

/**
 * Replace the tabulator characters of a String by the corresponding number of spaces.
 * Example:<pre>
 *   1.&lt;tab&gt;firstpoint&lt;tab&gt;page  1
 *   10.&lt;tab&gt;secondpoint&lt;tab&gt;page 10 </pre>
 * will become<pre>
 *   1.      firstpoint      page  1
 *   10.     secondpoint     page 10</pre>
 *
 * @param text     the text
 * @param tabstop  the espacement between the tab stops, typically 4 or 8
 * @return The text, with no &lt;tab&gt; character anymore
 */
public static String retab(final String text, final int tabstop)
{
    final char[] input = text.toCharArray();
    final StringBuilder sb = new StringBuilder();

    int linepos = 0;
    for (int i = 0; i<input.length; i++)
    {
        // treat the character
        final char ch = input[i];
        if (ch == '\t')
        {
            // expand the tab
            do
            {
                sb.append(' ');
                linepos++;
            } while (linepos % tabstop != 0);
        }
        else
        {
            sb.append(ch);
            linepos++;
        }

        // end of line. Reset the lineposition to zero.
        if (ch == '\n' || ch == '\r' || (ch|1) == '\u2029' || ch == '\u0085')
            linepos = 0;

    }

    return sb.toString();
}
票数 2
EN

Stack Overflow用户

发布于 2016-11-28 05:37:16

我使用Java8 Streams重写了The ANTLR Guy's answer,也使用了Alexis C.'s Streams-based code to repeat a string

static String repeatString(String s, int count) {
   return Stream.generate(() -> s).limit(count).collect(Collectors.joining());
}

static String expandTabs(String s, int tabSize) {
   int[] col = new int[1];
   return s.chars().mapToObj(c -> {
      switch (c) {
         case '\t':
            int expandBy = tabSize - col[0] % tabSize;
            col[0] += expandBy;
            return repeatString(" ", expandBy);
         case '\n':
            col[0] = 0;
            break;
         default:
            col[0]++;
      }
      return String.valueOf((char) c);
   }).collect(Collectors.joining());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11722855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档