349

セパレータを使用して値を分割しようとしています。しかし、私は驚くべき結果を見つけています

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値がどこにあっても、配列内にある必要があります。

4

5 に答える 5

589

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)分割できない""ため、結果の[""]配列として取得します。
これは、ここで分割が行われなかったために発生します。したがって、""空であり、末尾が元の文字列であり、分割プロセスによって作成された空の文字列ではありません。

于 2013-01-30T10:44:28.183 に答える
38

のドキュメントからString.split(String regex)

このメソッドは、指定された式とゼロの制限引数を使用して2引数のsplitメソッドを呼び出すかのように機能します。したがって、末尾の空の文字列は結果の配列に含まれません。

したがってString.split(String regex, int limit)、負の値を持つ2つの引数バージョンを使用する必要があります。

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

Doc:

制限nがゼロより大きい場合、パターンは最大でn-1回適用され、配列の長さはn以下になり、配列の最後のエントリには、最後に一致した区切り文字を超えるすべての入力が含まれます。nが正でない場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができます。nがゼロの場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができ、末尾の空の文字列は破棄されます。

これにより、末尾の要素を含む空の要素が除外されることはありません。

于 2013-01-30T10:47:32.300 に答える
7

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

これは常に実際の要件ではありません。上記の欠点を以下に示します。

Scenerio 1:
When all data are present:
    String data = "5|6|7||8|9|10|";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 7
    System.out.println(splt.length); //output: 8

データが欠落している場合:

Scenerio 2: Data Missing
    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output: 8

データが欠落していますが、実際の要件は長さが7である必要があります。データベースなどに挿入する必要がある場合などがありますので。これは、以下のアプローチを使用して実現できます。

    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output:7

ここで行ったことは、「|」を削除することです。最後にパイプしてからストリングを分割します。区切り文字として「、」がある場合は、replaceAll内に「、$」を追加する必要があります。

于 2018-06-09T05:48:24.193 に答える
5

String.split()APIドキュメントから:

指定された正規表現の一致を中心にこの文字列を分割します。このメソッドは、指定された式とゼロの制限引数を使用して2引数のsplitメソッドを呼び出すかのように機能します。したがって、末尾の空の文字列は結果の配列に含まれません。

オーバーロードされたString.split(regex、int)は、ケースに適しています。

于 2013-01-30T10:44:36.537 に答える
2

空白文字、コンマ、セミコロンなど、複数の区切り文字がある場合があります。次のように、[]+を使用して繰り返し可能なグループに区切り文字を使用します。

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

a、b、c、dの4つのトークンがあります

この分割を適用する前に、ソース文字列の先頭の区切り文字を削除する必要があります。

尋ねられた質問への答えとして:

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

空白を|と一緒に区切り文字として使用する場合に備えて、空白を追加しました。

于 2019-04-16T05:26:10.593 に答える