Javaについて徹底解説!

Javaの部分文字列取得の基本「String.substring()」を覚えよう!

Javaでの部分文字列の取得はString.substring()で行うのが基本です。String.substring()の使い方を知ることは、実用的なプログラムを作れるようになるための第一歩です。部分文字列の取得は、実務でのプログラミングでも頻繁に行います。

この記事ではString.substring()や、関連するString.indexOf()について初心者向けに解説しますので、ぜひ使い方を覚えて行ってください。

1.String.substring()の使い方

1-1.Stringのインデックスとは文字単位の位置

ここでString.substring()を使うために必要な、Stringのインデックスの考え方をまず覚えましょう。Stringのインデックスとは、文字列中に含まれる文字に順番に割り当てられた数字です。

文字列の最初の文字がインデックス 0 で、順番に+1されます。これは配列の添え字と同じルールです。ですので、最後の文字のインデックスは、String.length()より1少ない数になります。

Stringのインデックスの考え方はこれだ!

なお、JavaではStringを使う場合は文字数でインデックスを指定します。他のプログラミング言語でShift_JISなどを扱う時とは違い、各文字のbyte数は意識しなくてもよいので、いわゆる全角・半角の文字種判断結果による調整も不要です。

1-2.指定範囲の部分文字列の取得

Stringからの文字列の部分文字列の取得には、String.substring(int, int)を使います。2つ目の引数は、切り出す文字数ではなくインデックスですので、他のプログラミング言語やSQLなどの文法と混同しないようにしましょう。さらに、引数の説明文の「含む」「含まない」という表現にも注意しましょう。

intの使い方はこれだ!

文字列中の文字数を超えた範囲のインデックスを指定すると、例外(IndexOutOfBoundsException)が発生します。例外発生時は開始・終了インデックスが、指定できる範囲内か確認しましょう。

1-3.指定インデックスから後ろの部分文字列の取得

あるインデックスから後ろの文字列を全て部分文字列として取得する場合は、String.substring(int)を使います。String.substring(int, int)でもできますが、こちらの方が簡単です。

使用例は以下のとおりです。

1-4.部分文字列の比較にはString.equals()を使う

JavaのStringの特徴は不変(Immutable)であることです。不変とは、Stringの個々のインスタンスが保持している値は、何をしても変わらないということです。

ですので、String.substring()を実行した後でも、部分文字列の取得元のStringで保持している値は何も変わっていません。String.substring()は、部分文字列の新しいStringのインスタンスを戻すだけだからです。

String.substring()を実行すると都度異なるStringのインスタンスが生成されますので、部分文字列の比較にインスタンスの同値性を比較する == を使うと、通常想定する結果が得られません。Stringの比較にはequalsを使いましょう。

2.【応用】String.indexOf()との組み合わせ

String.substring()は切り出すインデックスの具体的な数値が必要です。ですので、例えば「文字列中にあるはずの文字から始まるインデックスから、部分文字列を得たい」という場合は、インデックスを取得するメソッドと組み合わせる必要があります。

インデックスを取得する基本はString.indexOf()です。String.indexOf()は対象のStrig内から文字あるいは文字列の一番最初のインデックスを戻します。ですので、これを開始/終了インデックスの値として使えます。

例えば、以下のように組み合わせて使います。

なお、String.indexOf()は文字あるいは文字列がString中に存在しない場合は-1を戻すので、String.substring()を実行する/しないの判断にも使えます。

String.indexOf()に関連するメソッドには以下のものがありますので、用途に応じて使い分けましょう。詳細はJava標準APIのドキュメントを参照してください。

3.【応用】String.substring()の活用例

3-1.ファイル拡張子、ファイル名部分の取得

String.substring()とString.lastIndexOf()の例として、ファイルの拡張子を得る際に使えます。拡張子を除く部分が必要な場合も同じ考え方です。

ファイルのパスからファイル名だけ抜き出したい場合も考え方は同じです。区切り文字を変えるだけですね。

3-2.年月日・日時文字列の分解

年月日などの文字列をString.substrnig()で分解することも良く行います。

実務では正規表現でのパターンマッチングや、SimpleDateFormat/DateTimeFormatterなどでの解析も使いますが、文字列の書式が固定ならString.substring()の方が記述は簡単です。それに、単純な処理速度ならString.substring()がほぼ最速です。

3-3.CSVの分解

CSV(comma-separated values)などの、特定の区切り文字で連結した文字列から、各要素を抜き出す時にもString.substring()は使えます。簡単に行うならString.split()でいいのですが、区切り文字が“”で囲まれている場合など単純に処理出来ない場合もあるので、これをベースに拡張したりします。

3-4.全角空白対応版trim

String.trim()は文字列の前後の空白()を削除しますが、日本語を扱う場合は、いわゆる全角空白も削除したい場合があります。その場合には、例えば以下のようなコードとなります。これはString.trim()のソースコードを一部変更したものです。

※正確には空白よりもコードポイントが小さい文字、詳細はAPIドキュメントを参照

4.まとめ

Javaで部分文字列を取得するにはString.substring()を使います。String.substring()には範囲を指定するものと、最後まで指定するものの二種類がありますので、用途に応じて使い分けましょう。String中の文字のインデックスを取得するには、String.indexOf()lastIndexOf()を使いましょう。

なお、この記事の内容はあくまで基本です。実務、特に入力文字列を制限しづらいWEB環境で使う際は、Unicodeのサロゲートペアや文字の合成・正規化の知識が必要になることがあります。もし想定どおりに部分文字列が取得できない場合は、これらのキーワードに関する知識も適宜学んでいきましょう。