3

パイプで区切られたレコードを解析しようとしています。私はこのコードを持っています:

public class Test {
    public static void main(String[] args) throws Exception {
        String[] components = "EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|");
        System.out.println(java.util.Arrays.toString(components));
    }
}

あなたはそれが印刷されることを期待します:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ]

しかし、そうではありません。それは印刷します:

[EN, 1056209, , , KA3NDL, L]

length配列の属性にアクセスすると、components正しく印刷されていることがわかります。

これが/回避策である理由を知っている人はいますか?

編集:

これは機能します:

public class Test {
    public static void main(String[] args) throws Exception {
        String[] components = "EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|", -1);
        System.out.println(java.util.Arrays.toString(components));
    }
}
4

4 に答える 4

15

String.splitlimit 引数を指定しないStringsと、結果配列からすべての末尾の空が削除されます。制限を含める必要があります。

String str = "EN|1056209|||KA3NDL|L|||||||||||||||||||||";
String[] components = str.split("\\|", -1);

からString.split(String, int):

n が正でない場合、パターンは可能な限り何度でも適用され、配列は任意の長さにすることができます。n がゼロの場合、パターンは可能な限り何度でも適用され、配列の長さは任意であり、末尾の空の文字列は破棄されます。

呼び出しは、制限が0String.split(String)の 2 つの引数を呼び出すことと同じです。split

于 2012-08-16T18:09:56.493 に答える
4

末尾の空の文字列が保持されるように、分割メソッドに制限を渡すことができます。

"EN|1056209|||KA3NDL|L|||||||||||||||||||||".split("\\|", -1)
于 2012-08-16T18:10:55.967 に答える
2

split()代わりにの 2 引数バージョンを使用してください。空の文字列も返すかどうかを構成できます。

于 2012-08-16T18:10:13.147 に答える
1

優れた Guava LibrariesでSplitterを見てください。

String input = "EN|1056209|||KA3NDL|L|||||||||||||||||||||";
Iterable<String> splitIter = Splitter.on("|").split(input);
System.out.println(splitIter);

出力:

[EN, 1056209, , , KA3NDL, L, , , , , , , , , , , , , , , , , , , , , ]
于 2012-08-16T18:12:08.363 に答える