4

テキストの文字をスペースに展開するJavaメソッドを知っていますか?

私のテキスト:

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

タブを直接、たとえば 4 つのスペースに置き換えると、次のようになります。

1.    firstpoint    page1
10.    secondpoint    page2

その代わりに、各タブを実際に対応するスペースの数で置き換える方法が必要です (vim のコマンド :retab のように)。解決策はありますか?

4

5 に答える 5

5

最初のタブを無視する上記の 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();
}
于 2016-01-21T20:18:36.600 に答える
4

おそらくこれを行うライブラリが存在しますが、手動での解決策は非常に簡単です。

  1. 出力バッファを作成します ( StringBuilder)。
  2. 文字列の文字を繰り返します
  3. 各文字について、それがタブかどうかを確認します。
    を。タブでない場合は、出力バッファーに追加します。
    b. タブの場合は、最初にスペースを追加してから、出力バッファーの長さが 4 で割り切れるのに必要な数のスペースを追加します (タブの長さ)。
  4. 出力バッファを返します。
于 2012-07-30T13:53:25.390 に答える
2

私はウェブ上で実装を見つけられなかったので、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();
}
于 2012-07-30T14:48:22.217 に答える
1

Java 8 Streams を使用してANTLR Guy の回答を書き直し、 Alexis C. の Streams ベースのコードを使用して文字列を繰り返しました

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());
}
于 2016-11-27T21:37:15.797 に答える