本記事では、Javaのsplitメソッドの使い方について解説します。
目次
splitメソッドは文字を分割する
splitは、対象の文字列を指定した区切り文字で分割し、分割した文字を配列の要素として格納するメソッドです。
引数に単純な文字(列)を指定した場合は、文字に一致した位置で文字列を分割します。
splitメソッドの使い方
splitメソッドの使い方は次の通りです。
String型の変数.split("区切り文字", 分割の回数);
第一引数に指定する区切り文字は、正規表現で指定します。
正規表現とは、「ある特定の文字列パターンを1つの形式で表現する方法」のことを指します。
詳しくは以下の記事で解説していますので「正規表現って何だろう?」という方はチェックしてみてください。
【関連記事】
▶︎苦手意識を克服しよう!Java正規表現の基本を初心者向けに解説!
また、第二引数に分割の回数を指定できます。回数指定が必要なければ省略も可能です。
第二引数を省略した場合、配列の要素数は制限されず、配列の終わりに空の文字列がある場合は破棄されます。
第二引数に指定した分割回数が0よりも大きい場合、配列に格納される要素数は指定した引数の値以下になります。
0よりも小さい(負の数)場合、列の要素数は制限されず、配列の終わりに空の文字列がある場合は破棄されません。
また、第二引数に0を指定した場合は、省略した場合の動きと同様になります。
splitメソッドの区切り文字を指定する
では実際に、splitメソッドの区切り文字を指定して文字列を分割してみましょう。
,(カンマ)で分割
区切り文字に「,」を指定した場合の記述例・実行例です。
■記述例 public class Main { public static void main(String args[]){ String str = "potepan,style,media"; System.out.println("区切る前の文字列: " + str); String[] words = str.split(","); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan,style,media 区切られた文字: potepan 区切られた文字: style 区切られた文字: media
.(ドット)で分割
区切り文字に「.」を指定した場合の記述例・実行例です。
「.」で分割を行う場合、引数に「.」を指定してもうまく分割できません。
「.」は正規表現で「任意の一文字」を意味するためです。つまり、「.」を文字の「.」として扱っていないんですね。
そこで、少し工夫を凝らして Patternクラスの quoteメソッド を使用します。
quoteメソッドは、指定されたStringのリテラル・パターンStringを返すメソッドです。
これによって「.」を文字として認識し、期待した動作で文字を区切れます。
■記述例 import java.util.regex.Pattern; public class Main { public static void main(String args[]){ String str = "potepan.style.media"; System.out.println("区切る前の文字列: " + str); String[] words = str.split(Pattern.quote(".")); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan.style.media 区切られた文字: potepan 区切られた文字: style 区切られた文字: media
改行コードで分割
区切り文字に改行コード「\n」を指定した場合の記述例・実行例です。
■記述例 public class Main { public static void main(String args[]){ String str = "potepan\nstyle\nmedia"; System.out.println("区切る前の文字列: " + str); String[] words = str.split("\n"); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan style media 区切られた文字: potepan 区切られた文字: style 区切られた文字: media
タブで分割で分割
区切り文字にタブ「\t」を指定した場合の記述例・実行例です。
■記述例 public class Main { public static void main(String args[]){ String str = "potepan\tstyle\tmedia"; System.out.println("区切る前の文字列: " + str); String[] words = str.split("\t"); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan style media 区切られた文字: potepan 区切られた文字: style 区切られた文字: media
空白で分割で分割
区切り文字に空白を指定した場合の記述例・実行例です。
■記述例 public class Main { public static void main(String args[]){ String str = "potepan style media"; System.out.println("区切る前の文字列: " + str); String[] words = str.split(" "); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan style media 区切られた文字: potepan 区切られた文字: style 区切られた文字: media
splitメソッドで複数の区切り文字を指定する方法
前章で、指定した区切り文字で文字列を分割する方法を紹介しました。
ここでは、少し応用して複数の区切り文字を指定する方法を見ていきましょう。
区切り文字を複数するには、第一引数の区切り文字を「[](ブラケット)」で囲います。
記述例は次の通りです。
■記述例 public class Main { public static void main(String args[]){ String str = "address=style,potepan,com"; System.out.println("区切る前の文字列: " + str); String[] words = str.split("[=,]"); for (String word : words) { System.out.println("区切られた文字: " + word); } } }
ここでは、addressを意味する「=」と、それぞれの単語を区切っている「,」の2つを区切り文字に指定しました。
実行結果は次の通りです。
■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: address=style,potepan,com 区切られた文字: address 区切られた文字: style 区切られた文字: potepan 区切られた文字: com
splitメソッドで空文字を指定して1文字ずつ分割する方法
splitメソッドの引数に空文字を指定すると、文字列を1文字ずつ分割可能です。
空白「” “」ではなく、空文字「””」である点はしっかり覚えておきましょう。
記述例・実行例は次の通りです。
■記述例 public class Main { public static void main(String args[]){ String str = "style.potepan.com"; System.out.println("区切る前の文字列: " + str); String[] words = str.split(""); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: style.potepan.com 区切られた文字: s 区切られた文字: t 区切られた文字: y 区切られた文字: l 区切られた文字: e 区切られた文字: . 区切られた文字: p 区切られた文字: o 区切られた文字: t 区切られた文字: e 区切られた文字: p 区切られた文字: a 区切られた文字: n 区切られた文字: . 区切られた文字: c 区切られた文字: o 区切られた文字: m
このように、1文字ずつ分割できているのがわかります。
splitメソッドで末尾の空文字は除外しない方法
splitメソッドの第二引数を指定しない場合、末尾の空文字は除外されます。
末尾の空文字も除外せずに文字列を分割したい場合は、第二引数にマイナスの値を設定しましょう。
実際に、第二引数に0を指定した場合(省略した場合)と、-1を指定した場合を比較してみます。
■記述例 public class Main { public static void main(String args[]){ String str = "style,potepan,com,,"; System.out.println("区切る前の文字列: " + str); System.out.println(); String[] words = str.split(",", 0); for (String word : words) { System.out.println("区切られた文字: " + word); } System.out.println("配列のサイズ:" + words.length); System.out.println(); words = str.split(",", -1); for (String word : words) { System.out.println("区切られた文字: " + word); } System.out.println("配列のサイズ:" + words.length); } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: style,potepan,com,, 区切られた文字: style 区切られた文字: potepan 区切られた文字: com 配列のサイズ:3 区切られた文字: style 区切られた文字: potepan 区切られた文字: com 区切られた文字: 区切られた文字: 配列のサイズ:5
このように、マイナスの値を指定すると空文字も含めた区切りが実現でき、配列のサイズも変わってきます。
状況に合わせて区切りを使いこなせるようにしてください。
splitで分割した文字をArrayListで取得する方法
splitメソッドで文字列を分割し、結果をArrayListで取得するは、asListメソッドを使って変換しましょう。
asListメソッドは、配列をリスト(コレクション)に変換するためのメソッドです。
サンプルコードで動きを確認しましょう。
■記述例 import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String args[]){ String str = "style,potepan,com"; System.out.println("区切る前の文字列: " + str); List<String> words = new ArrayList<String>(Arrays.asList(str.split(","))); System.out.println("ArrayListに格納した文字: " + words); System.out.println("ArrayListに格納した1文字目: " + words.get(0)); System.out.println("ArrayListに格納した2文字目: " + words.get(1)); System.out.println("ArrayListに格納した3文字目: " + words.get(2)); } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: style,potepan,com ArrayListに格納した文字: [style, potepan, com] ArrayListに格納した1文字目: style ArrayListに格納した2文字目: potepan ArrayListに格納した3文字目: com
このように、分割した文字をArrayListに格納し、取得までできました。
なお、ArrayListについて詳しく知りたい場合は、以下の記事を参考にしてみてください!
【関連記事】
▶︎【Java入門】ArrayListの使い方!配列との違いも解説
splitで複数の空白を含む文字列を分割する方法
区切りたい文字列の中に空白が複数ある場合、先述した方法で分割すると次のようになってしまいます。
■記述例 public class Main { public static void main(String args[]){ String str = "potepan style media"; System.out.println("区切る前の文字列: " + str); String[] words = str.split(" "); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan style media 区切られた文字: potepan 区切られた文字: 区切られた文字: 区切られた文字: style 区切られた文字: 区切られた文字: media
複数の空白を一つの区切り文字として指定する場合、正規表現で「” +”」と指定しましょう。
「+」を追加することで、直前の文字が1回以上繰り返す場合にマッチします。
■記述例 public class Main { public static void main(String args[]){ String str = "potepan style media"; System.out.println("区切る前の文字列: " + str); String[] words = str.split(" +"); for (String word : words) { System.out.println("区切られた文字: " + word); } } } ■実行結果 mbp:desktop potepan$ java Main 区切る前の文字列: potepan style media 区切られた文字: potepan 区切られた文字: style 区切られた文字: media
これで期待した通りの動きになりました。
splitで文字列がnullの場合に気をつけること
splitメソッドは、対象の文字列がnullだった場合、例外処理 NullPointerException が発生します。
そのため、nullが含まれる可能性がある場合、try-catch文で例外処理を実装するか、nullチェックをすると良いでしょう。
次のように記述できます。
■記述例① public class Main { public static void main(String args[]){ String str = null; System.out.println("区切る前の文字列: " + str); if(str != null) { String[] words = str.split(" +"); for (String word : words) { System.out.println("区切られた文字: " + word); } } else { System.out.println("str は null です"); } } } ■実行結果① mbp:desktop potepan$ java Main 区切る前の文字列: null str は null です
■記述例② public class Main { public static void main(String args[]){ String str = null; System.out.println("区切る前の文字列: " + str); try{ if(str != null) { String[] words = str.split(" +"); for (String word : words) { System.out.println("区切られた文字: " + word); } } else { System.out.println("str は null です"); throw new NullPointerException(); } } catch(NullPointerException e) { e.printStackTrace(); } } } ■実行結果② mbp:desktop potepan$ java Main 区切る前の文字列: null str は null です java.lang.NullPointerException at Main.main(Main.java:14)
splitメソッドでは、よく「,(カンマ)」や特定の文字列を指定して使うことが多いです。