Java split 文字列を分割する方法 - クラス String ホームページ制作 | 墨田区

Java split 文字列を分割する方法 – クラス String

LINEで送る
Pocket

Javaでは指定文字列を分割するのにsplitを利用します。他のプログラム言語でもおなじみですよね。プログラミングの基本である文字列操作ですが、ここでは、指定された文字列を分割する方法をご紹介します。

では split とはどんなメソッドなのか Java API ドキュメント を確認してみましょう。




【PR】マジか?!「アレ」してるLINEスタンプっていったい・・・


以下のURLで確認できます。
http://docs.oracle.com/javase/jp/6/api/java/lang/String.html#split(java.lang.String)

Java splitとは

Java APIドキュメント
パラメータ: regex - 正規表現の区切り 
戻り値: この文字列を指定された正規表現に一致する位置で分割して計算された文字列の配列
説明:
この文字列を、指定された正規表現に一致する位置で分割します。
このメソッドの動作は、2 つの引数を取る split メソッドを、指定された式および引数制限ゼロを指定して呼び出した場合と同じになります。つまり、結果として得られる配列には後続の空の文字列は含まれません。

なるほど、では試してみましょう。

ドット( . ) は、正規表現では、「任意の文字」という特殊な意味を持っています。このまま利用すれると、正しい結果は得られません。
\ で、エスケープすることで正しい結果が得られます。

以下、ドット( . )区切りのサンプルです。

String sp1 = "saka-en.さかえん.サカエン.";
String[] sps1 = sp1.split("\\.");
for ( int i = 0; i < sps1.length; i++ ) {
	System.out.println(sps1[i]);
}

こちらは、タブ区切りのサンプルです。

String sp2 = "saka-en	さかえん	サカエン	";
String[] sps2 = sp2.split("\t");
for ( int i = 0; i < sps2.length; i++ ) {
	System.out.println(sps2[i]);
}

結果は以下の通りです。

saka-en
さかえん
サカエン

API ドキュメントに書かれている「結果として得られる配列には後続の空の文字列は含まれません。」の通り、最後の区切り文字以降(ドットやタブ)は含まれませんでしたね。

Java split しきい値を指定

今度は、しきい値を指定した場合です。
API ドキュメントには以下のように記述があります。

Java APIドキュメント
パラメータ:
regex - 正規表現の区切り
limit - 結果のしきい値
戻り値: この文字列を指定された正規表現に一致する位置で分割して計算された文字列の配列
説明:
この文字列の各部分文字列を含むメソッドにより返される配列は、指定された式に一致する別の部分文字列、またはその文字列の最後で終了します。
配列内の部分文字列の順序は、この文字列内で出現する順序になります。
入力されたどの部分とも式が一致しない場合、配列は 1 つの要素 (つまり、この文字列) だけを保持します。limit パラメータは、このパターンの適用回数、つまり、結果として得られる配列の長さを制御します。制限 n がゼロより大きい場合、このパターンは n - 1 回以下の回数が適用され、配列の長さは n 次のようになります。 配列の最後のエントリには、最後にマッチした区切り文字以降の入力シーケンスがすべて含まれます。
n が負の値の場合、このパターンの適用回数と配列の長さは制限されません。
n がゼロの場合、このパターンの適用回数と配列の長さは制限されませんが、後続の空の文字列は破棄されます。

なるほど、しきい値 – 1 ってのがミソですね。
試してみましょう。

以下のテストを実行すると・・・

String sp3 = "saka-en,さかえん,サカエン";
String[] sps3 = sp3.split(",", 0);
for ( int i = 0; i < sps3.length; i++ ) {
	System.out.println(sps3[i]);
}

結果は以下の通りです。

saka-en
さかえん
サカエン

しきい値に 0 を指定した場合、指定していないのと同じ結果が得られます。

では、しきい値に 0 より大きい値を入れてみるとどうなるのでしょうか?

試してみましょう。
以下、しきい値に 1 を指定した場合です。

String sp4 = "JavaJavaJava";
String[] sps4 = sp4.split("a", 1);
for ( int i = 0; i < sps4.length; i++ ) {
	System.out.println(sps4[i]);
}

結果は以下の通りです。

JavaJavaJava

以下、しきい値に 2 を指定した場合です。

String sp5 = "JavaJavaJava";
String[] sps5 = sp5.split("a", 2);
for ( int i = 0; i < sps5.length; i++ ) {
	System.out.println(sps5[i]);
}

結果は以下の通りです。

J
vaJavaJava

以下、しきい値に 3 を指定した場合です。

String sp6 = "JavaJavaJava";
String[] sps6 = sp6.split("a", 3);
for ( int i = 0; i < sps6.length; i++ ) {
	System.out.println(sps6[i]);
}

結果は以下の通りです。

J
v
JavaJava

結果をみると、しきい値 – 1 の回数だけ、分割されているのがわかりますね。

では、しきい値に、マイナス を指定するとどうなるのでしょうか?
試してみましょう。
以下、しきい値に -1 を指定した場合です。

String sp7 = "JavaJavaJava";
String[] sps7 = sp7.split("a", -1);
for ( int i = 0; i < sps7.length; i++ ) {
	System.out.println(sps7[i]);
}

結果は以下の通りです。

J
v
J
v
J
v
""(空文字)

以下、しきい値に -2 を指定した場合です。

String sp8 = "JavaJavaJava";
String[] sps8 = sp8.split("a", -2);
for ( int i = 0; i < sps8.length; i++ ) {
	System.out.println(sps8[i]);
}

結果は以下の通りです。

J
v
J
v
J
v
""(空文字)

APIドキュメントに「負の値の場合、このパターンの適用回数と配列の長さは制限されません。」とある通り、特に制限をされない結果が得られましたね。


まとめとサンプルソース

実務で利用するとすれば、システム間のデータのやり取りで、区切り文字を使うケースが多いですね。しきい値を使った分割処理はほとんどしないと思いますが、覚えておいて損はないと思います。

ちなみに対象となる文字列が null の場合、NullPointerException が発生します。
都度 try {} catch {} で例外を取得してもいいのですが、ソースが煩雑になるので、以下のようなメソッドを用意して対応する方が、トラブルが少ないでしょう。

/**
 * 指定された正規表現に一致する位置で分割します。
 *
 * @param value 処理対象となる文字列
 * @param regex 正規表現の区切り
 * @return 分割後の配列
 */
public static String[] split(String value, String regex) {
	String[] values = new String[0];
	if ( value == null || value.length() == 0 || regex == null || regex.length() == 0 )
		return values;
	return value.split(regex);
}
/**
 * 指定された正規表現に一致する位置で分割します。
 *
 * @param value 処理対象となる文字列
 * @param regex 正規表現の区切り
 * @param limit 結果のしきい値
 * @return 分割後の配列
 */
public static String[] split(String value, String regex, int limit) {
	String[] values = new String[0];
	if ( value == null || value.length() == 0 || regex == null || regex.length() == 0 )
		return values;
	return value.split(regex, limit);
}

処理対象となる文字列が null だったとしても、長さ 0 の配列を返してくれますので、
NullPointerException が発生することはありませんね。
後は呼び出し元で、長さ 0 だったら・・・とやって、処理を分岐させましょう。


おつかれさまでした。

LINEで送る
Pocket

この記事がお役に立ちましたら シェア をお願いいたします。

Javaの勉強が思うように進まないときは!

Javaの勉強が思うように進まないのであれば、プロに直接質問ができる プログラミングスクール を検討してみてはいかがでしょうか?プログラミングスクールに申し込めば、短期間で一定のスキルを身に着けることができます!

Javaコースあり!オンライン完結型 テックアカデミー TechAcademy [テックアカデミー]

どこかに通う必要なく、自宅でプログラミングやアプリ開発を学ぶことができるのが特徴のスクールです。未経験からプロになるまで最短4週間という、超短期集中型の学習ができます。年齢層は10代〜40代の男女が中心で、学引があり多くの学生が受講しているそうですよ。オンラインで受講ができるスクールですので、全国どこからでも学習ができますね。

更にさらに、パーソナルメンターにチャット質問できちゃうんです!!

これは素晴らしいことですよ!ハマったり困ったことが起こるのがプログラミングの世界。知っている誰かに聞けば数分で解決することが、自分だけだと何時間もかかったりしますから!いや、これホントですよ。

しかし、便利な世の中になりましたよねー。一昔前ではオンラインで学習できるなんて、思いもよりませんでしたから。講師もバリバリのエンジニアですので、現場で使えるスキルを教えてもらえます。なんとも素晴らしいスクールがあったものですね。学割を使えば社会人より半額以下で受講できますから、学生さんには超おすすめです。

これから Java プログラミングを勉強して、将来はプログラマーとして活躍したいと思っている方には、就職保証付きJavaエンジニアコース というのがおすすめです。就職先まで保証してくれるとなれば、もう安心して学習に専念できますね。夢への第一歩はここから始まるのかも。あ、将来はライバルですね^^

オンラインスクールですから営業エリアは全国です。
気になる方は一度チェックしてみてください。無料の動画説明会も常時開催していますよ。


Javaコースあり!未経験者にウケてる KENスクール パソコンスクール・パソコン教室 【KENスクール】個別指導のWeb-DTP・OA・IT PCスクール

理解度や学習ペースに合わせて、一人ひとりが納得して前進できる授業を提供してくれるのが特徴です。特に課題製作は現場さながらで、実務に即したものとなっていますので短期でのスキルアップが望めます。自宅学習のサポートも充実していて、授業内容をいつでもビデオで振り返ることができるのもうれしいですね。好きな時間に好きな場所で、無理なくスケジューリングできるので、仕事の忙しい方でも柔軟に学ぶことができますよ。

更にさらに、なんと 就職サポート をしてくれるというのですから驚きです!!

履歴書の書き方から面接指導、求人の紹介など、具体的な就職先まで提案してくれるんです!私も「もっと早く出会いたかったなぁー、こんなスクール」・・・って思っちゃいました^^

東京・神奈川・愛知・大阪を営業エリアとされています。
まずは気軽に 無料体験予約 に申し込んでみるのもアリですよ。


コメント - Thank you for the comment.

  1. やまだ

    2013/05/22 16:10

     

    はじめまして。
    しきい値に負の値を指定した場合の結果ですが、配列の長さは7になり、最終要素には空文字が設定されているはずです。
    記載の内容ですと、長さ6の配列になるかのように見え、しきい値に0を指定(=引数1個のsplitを実行)する場合との違いが分からなくなってしまうのではないでしょうか。

    返信

     
    • サカエン

      2013/05/23 15:32

       

      コメントありがとうございます、また、ご指摘ありがとうございますm(_ _)m
      おっしゃる通り、配列の Length は 7 で、最終の要素には空文字が設定されます。
      正しくは、

      J
      v
      J
      v
      J
      v
      ""(空文字)
      
      となりますね。

      誤解を招く表現をしてしまい、申し訳ありません。

      返信

       

Trackback

  1. […] http://www.saka-en.com/java/java-split-string/ […]

コメントを残す

お名前 (必須)
メールアドレス
(アドレスは公開されません)

コメント(必須)

Trackback URL