2012-05-29 29 views
143

Javaの公式ドキュメントの状態:文字列"boo:and:foo"分割JavaのString

は、例えば、これらの式では、次の結果が得られ 正規表現結果 :

{ "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< 

ですが、なぜでしょうか?

+2

可能な複製を(私は私のために動作しませんでした。代わりに、.split("\\|")の本を使用)(http://stackoverflow.com/questions/3481828/how [Javaで文字列を分割する方法] -to-split-a-string-in-java) –

答えて

321

あなたが

test.split("\\|"); 

splitは、正規表現を使用し、正規表現|ORオペレータを表すメタ文字である必要があります。 \を使用してその文字をエスケープする必要があります(文字列で"\\"と書かれています)。\もまた文字列リテラルのメタ文字であり、別の\がエスケープする必要があるためです。

また

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

を使用してPattern.quote|を表す正規表現のエスケープバージョンを作成することもできます。 string.split("\\|")

それとも、まさにこの目的のために作成されたヘルパーPattern.quote()

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

+14

これは、['split()']](http://docs.oracle.com/javase/6/docs/api/java/lang/String.html #split%28java.lang。文字列%29)メソッドは正規表現を取り、 '|'は特殊文字です。 –

+0

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

-1

スプリット()メソッドは、引数

24

ために適切なエスケープとして正規表現を取ります任意の入力文字列で動作します。ユーザーの入力を引用/エスケープする必要があるときに非常に便利です。

+3

遷移が行われたときにはshureしませんが、Java 8では 'Pattern.quote()'が使用されます。 – RAnders00

1

また、Apacheのライブラリを使用してこれを行うことができます:

StringUtils.split(test, "|"); 
4

使用このコードを:あなたはまた、.split("[|]")を使用することができます

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

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

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

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

1

+0

どちらのバージョンも正常に動作するはずです。もしそうでなければ、問題は別の場所にあることを示唆している。 – Pshemo

+0

@Pshemoこれは興味深いフレーバーを追加しますが、括弧の中に入れておくと、いくつかの予約シンボルをエスケープする必要はありません。 –