- PR -

splitメソッド

1
投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-08-04 16:31
お世話になります。

Javaのプログラミングの勉強をしています。
splitメソッドを使用して、文字列を分けようとしています。

String test = "0:1:2=aaa/bbb/ccc"
String[] separate = test.split("=");

とすると、separateの長さは2となります。
しかし、'='を'|'に変えて

String test = "0:1:2|aaa/bbb/ccc"
String[] separate = test.split("|");

とすると、separateの長さは17となります。

なぜでしょうか?
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-08-04 16:44
半角の|なのか全角の|なのかどっちなのか分かりませんが、全角半角どっちでも2になりましたよ。半角の|はメタキャラクタだからエスケープしましたけど。

# 確認したJavaのバージョンは1.4.2_10
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-04 16:46
正規表現を要求してるのにメタキャラだけ渡してるからでは?
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-04 16:48
Stringのsplitメソッドには正規表現のパターンを指定するんですが、
半角の'|'は、正規表現では”(A|B)”というような使い方をする特殊
な意味を持つ文字です。エスケープ文字を付けて"\\|"と指定すると配
列の長さは2になってくれますよ。
詳しくはJavaDOCのPatternあたりのドキュメントを見ていただくと載
ってます。
'|'と指定すると、どんな文字でも対照になるから17(18?)という結果
になったんではないですかね。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-08-04 16:57
以下j2sdk1.4.2_08にて確認しています。

|は半角ですね
コード:
String test1 = "0:1:2=aaa/bbb/ccc" ;

String[] separate1 = test1.split("=");
System.out.println(separate1.length);
String test2 = "0:1:2|aaa/bbb/ccc" ;
String[] separate2 = test2.split("|");
System.out.println(separate2.length);


を実行すると
コード:
2

18


と言う結果が得られました。

何故2にならないのか、という問いかと思います。
これはString#splitの引数が単なる文字列ではなく
正規表現であるために起こります。
半角の|は正規表現の演算子のひとつとなっており
その意味はORです。

区切り文字が|であるとはつまり
何もないものor何もないものを区切り文字とする
という意味になってしまいます。

結果
コード:
String test2 = "0:1:2|aaa/bbb/ccc" ;

String[] separate2 = test2.split("|");


コード:
separate2 = {"","0",":","1",":","2","|","a","a","a","/","b","b","b","/","c","c","c"}


という結果を返すことになります。

もしも半角の|で区切りたいのであれば|をエスケープしてやる必要があります。
コード:
String test3 = "0:1:2|aaa/bbb/ccc" ;

String[] separate3 = test2.split("\|");


こうすることで結果
コード:
separate3 = {"0:1:2","aaa/bbb/ccc"}


を得ることが出来ます。


[ メッセージ編集済み 編集者: あすか 編集日時 2006-08-04 17:00 ]
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-08-04 17:07
引用:

あすかさんの書き込み (2006-08-04 16:57) より:
コード:
String[] separate3 = test2.split("¥|");




それだとコンパイルエラー起こしちゃいますよ。¥|ではなく¥¥|にしないといけません。

ソースファイル上 ¥¥|
コンパイル中の文字エスケープ処理 ¥|
パターン文字列のエスケープ処理 |(メタキャラではなく文字として)

# ¥は半角にしてください

[ メッセージ編集済み 編集者: 想馬 編集日時 2006-08-04 17:11 ]
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-08-04 17:20
ありがとうございました!!

メタキャラというキーワードを元に勉強させていただきました。
まだまだ勉強不足ですね。

アドバイスありがとうございます!
1

スキルアップ/キャリアアップ(JOB@IT)