1. ホーム
  2. java

[解決済み] Java 文字列の分割で空の値を削除

2022-03-16 05:39:48

質問

セパレータを使用して値を分割しようとしています。 しかし、次のような驚くべき結果が出ています。

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つの値しか得ていません。

何かアイディアと修正方法があれば教えてください。EMPTY値がどこに来ても、それは配列の中にあるべきものです。

解決方法は?

split(delimiter) は、デフォルトで結果の配列から末尾の空文字列を削除します。この機構を無効にするには、オーバーロードされたバージョンの split(delimiter, limit) と共に limit のように負の値に設定します。

String[] split = data.split("\\|", -1);

もう少し詳しく。
split(regex) の結果を返します。 split(regex, 0) であり ドキュメント このメソッドには、次のようなものがあります (強調)。

<ブロッククオート

は、その limit パラメータはパターンを適用する回数を制御するので、 結果の配列の長さに影響します。

もし、制限値 n ゼロより大きい の場合、パターンは最大 n - 1 回適用され、配列の長さは n よりも長くはならず、配列の最後のエントリには最後にマッチした区切り文字以降のすべての入力が含まれます。

もし n ノンポジ の場合、パターンは可能な限り何度も適用され、配列は任意の長さを持つことができます。

もし n ゼロ の場合、そのパターンは可能な限り何度も適用され、配列は任意の長さを持つことができ、そして 空文字列は破棄されます。 .

例外 :

末尾の空文字列を削除することは意味があります。 そのような空文字列が分割メカニズムによって作成された場合のみです。 . そのため "".split(anything) を分割することができないので "" という結果になります。 [""] の配列になります。
ここではsplitが起こらなかったから起こるのであって、だから "" が空であるにもかかわらず、末尾に オリジナル の文字列であって、空文字列ではありません。 作成 分割処理によるものです。