82

次の文字列があります。

String str = "\nHERE\n\nTHERE\n\nEVERYWHERE\n\n";

これを印刷すると、次のように出力されます (もちろん、\n「文字通り」印刷されるわけではありません)。

\n
HERE\n
\n
THERE\n
\n
EVERYWHERE\n
\n
\n

メソッドを呼び出すと、split("\n")改行 ( \n) 文字の間のすべての文字列を取得したいのですが、最後の空の文字列も含まれます。

たとえば、今日これを行うとします。

String strArray[] = str.split("\n");

System.out.println("strArray.length - " + strArray.length);
for(int i = 0; i < strArray.length; i++)
    System.out.println("strArray[" + i + "] - \"" + strArray[i] + "\"");

次のように出力したい (出力 A):

strArray.length - 8
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"
strArray[6] - ""
strArray[7] - ""

現在、次のように出力され (出力 B)、末尾の空の文字列はスキップされます。

strArray.length - 6
strArray[0] - ""
strArray[1] - "HERE"
strArray[2] - ""
strArray[3] - "THERE"
strArray[4] - ""
strArray[5] - "EVERYWHERE"

split()出力 A のようにメソッドに空の文字列を含めるにはどうすればよいですか? もちろん、私は複数行のコードを書くことができましたが、それを実装しようとして時間を無駄にする前に、簡単な方法や余分な 2 行ほどのコードが役立つかどうかを知りたかったのです。ありがとう!

4

3 に答える 3

167

str.split("\n", -1)(負のlimit引数を指定して)を使用します。splitにゼロまたは引数が指定されていない場合はlimit、後続の空のフィールドが破棄され、正のlimit引数が指定された場合は、フィールドの数がその数に制限されますが、の制限は、任意の数のフィールドを許可し、末尾の空のフィールドを破棄しないことを意味します。これはここに文書化されており、動作は Perl から取られています。

于 2012-12-18T19:16:03.897 に答える
7

末尾の空の文字列の分割を無視するように 1 引数分割メソッドが指定されていますが、「制限」引数を取るバージョンはそれらを保持するため、1 つのオプションは大きな制限でそのバージョンを使用することです。

String strArray[] = str.split("\n", Integer.MAX_VALUE);
于 2012-12-18T19:11:08.783 に答える
3

個人的には、分割用の Guava ユーティリティが気に入っています。

System.out.println(Iterables.toString(
   Splitter.on('\n').split(input)));

次に、空の文字列の動作を構成する場合は、次のようにします。

System.out.println(Iterables.toString(
   Splitter.on('\n').omitEmptyStrings().split(input))); 
于 2012-12-18T19:18:18.237 に答える