セパレータを使用して値を分割しようとしています。しかし、驚くべき結果が出ています
String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);
8 つの値を取得することを期待しています。[5、6、7、EMPTY、8、9、EMPTY、EMPTY]しかし、取得される値は 6 つだけです。
何かアイデアや修正方法はありますか。空の値がどこにあっても、配列内にある必要があります。
ベストアンサー1
split(delimiter)
デフォルトでは、結果の配列から末尾の空文字列を削除します。このメカニズムをオフにするには、次のように負の値に設定したsplit(delimiter, limit)
オーバーロード版を使用する必要があります。limit
String[] split = data.split("\\|", -1);
もう少し詳しく説明すると、内部的にand
split(regex)
の結果を返し、split(regex, 0)
ドキュメンテーションこの方法の詳細は以下をご覧ください(強調は筆者による)
この
limit
パラメーターはパターンが適用される回数を制御するため、結果の配列の長さに影響します。制限
n
が0 より大きい場合、パターンは最大 n - 1 回適用され、配列の長さは n 以下になり、配列の最後のエントリには最後に一致した区切り文字を超えるすべての入力が含まれます。
n
が正でない場合、パターンは可能な限り何回も適用され、配列の長さは任意になります。
n
がゼロの場合、パターンは可能な限り何度も適用され、配列の長さは任意に設定でき、末尾の空文字列は破棄されます。
例外:
末尾の空文字列を削除することは、そのような空文字列が分割メカニズムによって作成された場合にのみ意味があることに言及する価値があります。したがって、これ以上"".split(anything)
分割できないため、結果として配列""
が取得されます。これは、分割がここで発生しなかったために発生します。そのため、空であるにもかかわらず、末尾は分割プロセスによって作成された空文字列ではなく、元の文字列を表します。[""]
""