Javaのsubstringで文字列を切り出す方法とサンプル
今回は実務でも多用するsubtringの使い方について、さまざまな文字の抜き出し方を解説していきます。
今回は実務でも多用するsubtringの使い方について、さまざまな文字の抜き出し方を解説していきます。
スキルアップ
2023/02/22 UP
- プログラミング
- SE資格・スキル
- Java
substringはStringクラスのメソッドで、対象の文字列から部分文字列を抜き出せます。Javaの文字列処理としては頻繁に利用されるメソッドのひとつで、Stringクラスに関する操作としては基本といえます。
今回は実務でも多用するsubtringの使い方について、さまざまな文字の抜き出し方を解説していきます。
Javaにおけるsubstringの基礎知識
Javaでの部分文字列の取得は、基本的にStringクラスのsubstringメソッドで行います。
基本となる書き方は「String.substring(int beginIndex, int endIndex)」で、引数に取得を開始するインデックスと終了するインデックスを指定します。
部分文字列の取得は実際のプログラミングでは頻繁に使用するため、取得の基本的な考え方や記述方法を身につけておきましょう。
substringとインデックスの関係
substringメソッドを使うためには、抜き出したい部分文字列の正確なインデックスを知る必要があります。そのため、substringとインデックスの取得は密接な関係にあります。
Stringのインデックスは、文字列の文字に対して、先頭から順番に割り当てられた数字になります。
substringで指定範囲の部分文字列を取得するには、前項で解説したとおり部分文字列の取得には、String.substring(int beginIndex, int endIndex)と記述しますが、インデックスに文字数を超えた指定すると、例外(IndexOutOfBoundsException)が発生してしまいます。
抜き出したい文字がどこにあるのか、インデックスを取得しておくと例外処理の発生を回避できます。
substringの記述方法
substringの基本的な記述方法として、先頭と末尾からの抜き出しと、指定したインデックスからの抜き出しの、3つの方法について解説します。
文字列を指定した範囲で抜き出す
substringの基本型は、インデックスによる範囲指定です。取得を開始するインデックスと、終了するインデックスを指定することで、その間にある文字列を取得します。
注意したい点として、文字列のindex番号は、配列と同様に0から始まります。そのため、1文字目は0になります。
基本型のサンプルを見てみましょう。このサンプルでは、「あいうえおかきくけこ」という10文字の文字列に対して、index番号3から7までを抜き出し、出力しています。
サンプルコード:
public class main {
public static void main(String[] args) {
String str = "あいうえおかきくけこ";
System.out.println("元の文章:" + str);
String substr = str.substring(3, 7);
System.out.println("抜き出した文章:" + substr);
}
}
このサンプルを実行すると以下のように表示されます。
文字列を先頭から切り出す
文字列を先頭から指定文字数の部分文字列を抜き出す方法です。開始するインデックスを0にすると、簡単に先頭からの抜き出しができます。
サンプルでは先頭から3文字と5文字を抜き出しています。
サンプルコード:
public class main {
public static void main(String[] args) {
String str = "あいうえおかきくけこ";
System.out.println("元の文章:" + str);
System.out.println("文字列先頭から3文字:" + str.substring(0,3));
System.out.println("文字列先頭から5文字:" + str.substring(0,5));
}
}
このサンプルを実行すると以下のように表示されます。
文字列を後ろから抜き出す
文字列の後ろn文字分を抜き出したい場合は、substring(文字列名.length()-n)と記述します。length()というのは、Stringクラスのメソッドで、文字列の長さを取得します。
サンプルでは文字列の一番後ろから4文字を抜き出しています。
サンプルコード:
public class main {
public static void main(String[] args) {
String str = "あいうえおかきくけこ";
System.out.println("元の文章:" + str);
System.out.println("文字列の後ろから4文字:" + str.substring(str.length()-4));
}
}
このサンプルを実行すると以下のように表示されます。
文字列を指定したインデックスから抜き出す
指定した場所から後ろを抜き出すには、抜き出したい文字のひとつ前のindex番号を指定します。指定したindex番号の文字は、抜き出した部分文字列に含まれないことに注意してください。
また、この場合、終了するインデックスを指定する必要はありません。
サンプルではindex番号6の「か」より後ろの文字列が、部分文字列として抜き出されます。
サンプルコード:
public class main {
public static void main(String[] args) {
String str = "あいうえおかきくけこ";
String substr = str.substring(6);
System.out.println("元の文章:" + str);
System.out.println("抜き出した文章:" + substr);
}
}
このサンプルを実行すると以下のように表示されます。
indexOfとsubstringを組み合わせた応用的な記述方法
substringにはインデックスを指定する方法以外にも、特定の文字列や、開始位置と終了位置が特定できない場合の記述方法があります。
StringクラスのindexOfメソッドは、文字列の中を検索し、指定した文字列が最初に出現する位置のindex番号を返します。このindexOfメソッドの機能を使うことで、substringで抜き出す文字列のindex番号を指定します。
indexOfメソッドを応用した部分文字列の抜き出しは、実際のプログラミングでも頻繁に行われます。応用次第で文字列をさまざまな方法で活用できるため、使い方を覚えておくと便利なメソッドのひとつです。
特定の文字列から前、もしくは後ろを抜き出す
指定した特定の文字列を文字列の中から検索し、その前または後ろを抜き出すには、indexOfメソッドを使用します。
この機能を使うことで、特定の文字列をsubstringの基準にできます。
これは「氏名:山田太郎」「東京都千代田区」のように、名簿や地名、価格など、特定の文字や記号を目印にして、前後の一部だけを抜き出したい場合などに便利です。
今回のサンプルでは「:」を指定文字列にして、その後ろをすべて抜き出しています。
サンプルコード:
public class Sample {
public static void main(String[] args) {
String str = "ひらがな:カタカナ";
int index = str.indexOf(":");
System.out.println("元の文章:" + str);
System.out.println("結果:" + str.substring(index+1));
}
}
このサンプルを実行すると以下のように表示されます。文字列の「:」より後ろが抜き出されています。
特定の文字列の間にある文字列を切り出す
たとえば、「<table><tr><th>見出しセル</th></tr><tr><td>データセル</td></tr></table>」のような文字列から、「
この場合、「<th>」と「</th>」の間に挟まっている部分文字列を抜き出すための処理を書くことになります。
そこで、str.indexOf(str)で指定文字列が最初に出現するインデックスを取得し、変数に代入します。
さらに、変数をsubstringのindexに入れることで、特定の文字列を取得できます。
サンプルでは、「<th>見出しセル</th>」を抜き出すために、前後の文字列を変数に格納しています。
サンプルコード:
public class Sample {
public static void main(String[] args) {
String str = "<table><tr><th>見出しセル</th></tr><tr><td>データセル</td></tr></table>";
String beginStr = "<th>";
int beginIndex = str.indexOf(beginStr);
String endStr = "</th>";
int endIndex = str.indexOf(endStr) + endStr.length();
String strSubstring = str.substring(beginIndex, endIndex);
System.out.println(strSubstring);
}
}
このサンプルを実行すると以下のように表示されます。
その他のsubstringの使い方
ここからは、応用として、いくつか使い方のソースコードを紹介します。まずは開発中に出てくることの多いファイル名を扱うコードです。Splitで分割する方法もありますが、substringでも可能です。
サンプルコード:
public class Sample { public static void main(String[] args) { String fileName = "filename.csv"; int lastIndex = fileName.lastIndexOf('.'); String fname = fileName.substring(0, lastIndex); System.out.println(fname); String extension = fileName.substring(lastIndex + 1); System.out.println(extension); } }
ここでは、以下の行でまずピリオドの位置を探しています。
int lastIndex = fileName.lastIndexOf('.');
ピリオドの位置がわかったら、そこを起点に前にsubstringをかけてファイル名を、後ろにsubstringをかけて拡張子を取得しています。
※ピリオドより前を取得
String fname = fileName.substring(0, lastIndex);
※ピリオドより後を取得
String extension = fileName.substring(lastIndex + 1);
また、これを応用することで、yyyy/mm/dd 形式やyyyy-mm-dd 形式の日付を分割したりすることも可能です。
※サンプルコード public class Sample { public static void main(String[] args) { String fileName = "2022-11-16"; int dateIndex = fileName.lastIndexOf('-'); String date = fileName.substring(dateIndex + 1); System.out.println(date); // 日付 String yyyymm = fileName.substring(0,dateIndex); int monthIndex = yyyymm.lastIndexOf('-'); String month = yyyymm.substring(monthIndex + 1); System.out.println(month); String year = yyyymm.substring(0,monthIndex); System.out.println(year); } }
文字列の抜き出しは実務でも頻繁に使うので覚えておこう
文字列から特定の文字列を切り出す操作は、実際のプログラミングでも頻繁に使用します。特に、index番号が特定できないケースの処理はとても多く、indexOfとの組み合わせで特定の部分文字列を抜き出す処理を欠くことは珍しくありません。
substringは使用頻度が高いメソッドなので、しっかりと習得しておきましょう。