split(“ |”)を使用してパイプ記号でJava文字列を分割する


195

Javaの公式ドキュメントには次のように記載されています。

"boo:and:foo"たとえば、文字列は、これらの式Regex Resultで次の結果を生成します。

{ "boo", "and", "foo" }"

そして、それは私がそれを動作させるために必要な方法です。ただし、これを実行すると:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

それは印刷します:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

これは私が期待するものとはかけ離れています:

>A<
>B<
>C<
><
>D<

なぜこうなった?


回答:


423

あなたは必要です

test.split("\\|");

split正規表現を使用し、正規表現で |OR演算子を表すメタ文字です。を使用してその文字をエスケープする必要があります\(文字列リテラルのメタ文字でもある"\\"ため、文字列で記述され、エスケープする\ために別の文字が必要です\)。

あなたも使うことができます

test.split(Pattern.quote("|"));

Pattern.quoteエスケープバージョンの正規表現を作成してみましょう|


17
split()つまり、メソッドは正規表現を取り、正規表現の|特殊文字です
Jigar Joshi '29

1
あなたはスタックオーバーフローのモデレーターとして私の2番目の選択肢です。ではごきげんよう。
デニッシュシャーマ

33

適切なエスケープを使用します。 string.split("\\|")

または、Java 5以降では、Pattern.quote()まさにこの目的のために作成されたヘルパーを使用します。

string.split(Pattern.quote("|"))

任意の入力文字列で動作します。ユーザー入力を引用/エスケープする必要がある場合に非常に役立ちます。


3
移行がいつ行われたかはわかりませんが、Java 8ではを使用しますPattern.quote()
RAnders00 2016年

4

このコードを使用してください:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}

この解決策は、受け入れられた回答によってすでに指摘されています。繰り返す必要はありません。
Pshemo 2017年

3

Apacheライブラリを使用してこれを行うこともできます。

StringUtils.split(test, "|");

1

も使用できます.split("[|]")

(私はの代わりにこれを使用しましたが.split("\\|")、これは機能しませんでした。)


どちらのバージョンも正常に動作するはずです。そうでない場合、問題は別の場所にあることを示唆しています。
プシェモ2017年

@Pshemoただし、これは興味深いフレーバーを追加します。予約された一部の記号は、角括弧内に置いた場合、エスケープする必要はありません。
Pax Vobiscum 2017

0
test.split("\\|",999);

制限または最大値の指定は、「boo ||| a」または「|| boo |」のような例では正確です。または「|||」

ただし test.split("\\|");、同じ例では異なる長さの文字列配列を返します。

リファレンスを使用:リンク


-2

split()メソッドは、引数として正規表現を取ります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.