2013-03-05 45 views
15

なぜそれが、以下では、出力は[]としない[1]あることがありますか?分割区切り文字としてパイプ記号と文字列

String input="1|2|3"; 
String[] values= input.split("|"); 
System.out.println("[" + values[0] + "]"); 
// Output: [] 

ただし、セパレータを変更すると、出力は[1]になります。

String input="1;2;3"; 
String[] values= input.split(";"); 
System.out.println("[" + values[0] + "]"); 
// Output: [1] 
+0

'スプリット(文字列)'「正規表現の文字列」を取り、など'|'は 'regex or'として解釈され、何も分割されません。 '|'をエスケープして 'values 'の値を調べることでテストする必要があります –

+1

すべての文字と最初の空の文字列を分割します –

答えて

24

その文字エスケープしてみてください|は正規表現で特別な意味を持っているので

String input="1|2|3"; 
String[] values= input.split("\\|"); 
System.out.println("[" + values[0] + "]"); 
15

を。あなたはこのようにそれをエスケープする必要があります:\|とあなたが\\|

で終わるように、Javaで、あなたも同様にバックスラッシュをエスケープする必要があり、パイプ文字は、それがどちらかを選択する正規表現エンジンを伝えることを意味論理和演算子でありますそれの左右にパターンがあります。あなたの場合、空の文字列が何にもマッチするもの。

4

エスケープするときに分割するときに|の代わりに\\|を使用してみてください。

だからあなたのコードは、に変更します:あなたは文字をエスケープする必要が

String input="1|2|3"; 
String[] values= input.split("\\|"); 
System.out.println("[" + values[0] + "]"); 
+0

これはコンパイルされませんので、コードを確認してください。 Javaでは、二重にエスケープする必要があります、分割( "\\ |")。 –

+0

@ bmorris591答えが変更されました。私はそれを忘れて申し訳ありません! – aa8y

3

'|'適切に

String input="1|2|3"; 
     String[] values= input.split("\\|"); 
     System.out.println("[" + values[0] + "]"); 
-2

パイプ文字は論理式または正規表現に相当します。あなたが本当に区切りとしてパイプ文字を使用したい場合は、あなたが

String[] values= input.split("\|");

+1

これはコンパイルされません。コードを確認してください。 javaでは、 'split(" \\ | ")'をエスケープする必要があります。 –

6

のよう\でそれをエスケープする必要がありsplitメソッドは、パラメータとして正規表現を受け取ります。パイプは独自の目的の予約文字です(orを意味します)。

あなたはそれを逃れることができるのいずれか("\\|")または、あなたはJavaでなら1.5+あなたはこのようPattern.quote("|")を使用することができます。

input.split(Pattern.quote("|")); 
関連する問題