Javaの文字列切り出しを完全解説|substring・split・indexOfの使い方
CONTENTS
Javaを用いた開発において、文字列を切り出す処理は避けて通れない基本操作です。
例えば、ユーザー入力のチェック、CSVファイルの解析、APIから返ってきたログデータの抽出など、あらゆる場面で利用されます。
しかし、基本であるはずの substring で範囲指定エラーが出たり、split で意図しない場所で区切られたりと、意外な落とし穴が多いのも事実です。
そこで本記事では、文字列切り出しの全手法を体系的に解説します。
実務で頻出する substring・split・正規表現の使い分けをマスターし、エラーのない堅牢なコードを書きましょう。
Javaで文字列を切り出す基本|substringの仕組みと使い方
Javaの文字列切り出しにおいて、最も基本かつ頻繁に使われるのが substring() メソッドです。
このメソッドは、「開始位置から終了位置まで」を指定して文字列の一部を抽出します。
基本構文は以下のとおりです。
String result = text.substring(beginIndex, endIndex);
ここで初心者が最も混乱するのが、インデックス(添字)の扱いです。
Javaのルールでは、「beginIndex は含み、endIndex は含まない」という仕様になっています。
例えば、次のコードを見てみましょう。
String text = "ABCDEFG";
// 0文字目(A)から、3文字目(D)の手前まで
String result = text.substring(0, 3);
System.out.println(result); // 結果: "ABC"
このように、substring(0, 3) と指定した場合、取得される文字数は 3 - 0 = 3文字 となります。
「終了位置の数字そのものは含まれない」と覚えておくと、計算ミスを防ぎやすくなります。
さらに、endIndex を省略した場合は、指定位置から末尾までをすべて取得します。
// 3番目(D)から最後まで
System.out.println(text.substring(3)); // 結果: "DEFG"
substringの境界仕様とエラーになりやすいケース
substring を使う際、最も頻発するトラブルが IndexOutOfBoundsException です。
これは、存在しないインデックス位置を指定した場合に発生する例外です。
具体的には、以下のようなケースでアプリケーションがクラッシュします。
String s = "ABC"; // 長さは3
// エラー:5は範囲外
s.substring(0, 5);
// エラー:開始位置がマイナス
s.substring(-1, 2);
// エラー:開始位置が終了位置より大きい
s.substring(2, 1);
実務では、文字列の中身が空(長さ0)であったり、予想より短い文字列が渡ってくることが多々あります。
そのため、安全に切り出すためには、事前に長さチェックを行うのが鉄則です。
int targetLen = 5;
if (text != null && text.length() >= targetLen) {
System.out.println(text.substring(0, targetLen));
} else {
// エラーハンドリングまたはそのまま返す
}
詳しい仕様はJava公式ドキュメントのsubstringメソッド解説で確認できます。
条件に応じて部分文字列を取得する方法|split・indexOf・正規表現
単純な位置指定だけでなく、実務では「区切り文字」や「パターン」に応じた柔軟な切り出しが求められます。
ここでは、現場で頻繁に利用される3つの応用テクニックを解説します。
1. splitを使った分割処理と注意点
split() は、カンマやタブなどの区切り文字(デリミタ)で文字列を一括分割するメソッドです。
String csv = "apple,banana,orange";
String[] parts = csv.split(",");
// parts[0] -> "apple"
// parts[1] -> "banana"
しかし、注意が必要なのは splitの引数は正規表現として扱われる という点です。
例えば、ドット(.)やパイプ(|)などの特殊文字で分割しようとすると、期待通りに動きません。
String ip = "192.168.1.1";
// 失敗例:ドットは「任意の文字」を表す正規表現
String[] fail = ip.split(".");
// 成功例:バックスラッシュでエスケープする
String[] success = ip.split("\\.");
したがって、ファイルパスやIPアドレスを扱う際は、必ずエスケープ処理(\)を忘れないようにしましょう。
2. indexOf と substring を組み合わせる
「特定の文字が出てくるまでの部分」や「特定の文字以降」を取得したい場合、indexOf と substring の組み合わせが最強です。
この方法は、切り出したい位置が固定ではなく、動的に変わる場合に役立ちます。
String data = "user:alice";
// コロンの位置を探す
int pos = data.indexOf(":");
if (pos != -1) {
// 先頭からコロンの手前まで
String key = data.substring(0, pos);
// コロンの次の文字から末尾まで
String value = data.substring(pos + 1);
System.out.println(key); // "user"
System.out.println(value); // "alice"
}
JSONライクなデータの解析や、URLのパラメータ処理などで非常に重宝するパターンです。
3. 正規表現を使った高度な抽出
さらに複雑な条件、例えば「ID:の後ろにある数字だけを取り出したい」といった場合は、正規表現クラス(Pattern / Matcher)を使用します。
import java.util.regex.*;
String log = "Error at ID:12345 (Timeout)";
Pattern p = Pattern.compile("ID:(\\d+)");
Matcher m = p.matcher(log);
if (m.find()) {
// グループ1(カッコの中身)を取り出す
String id = m.group(1);
System.out.println(id); // "12345"
}
正規表現は学習コストがかかりますが、複雑なテキスト解析には不可欠な強力なツールです。
実務でよく使うパターンとベストプラクティス
文字列切り出しは簡単そうに見えて、実務ではバグの温床になりやすい処理です。
そこで、現場のエンジニアが意識しているチェックリストと実装パターンをまとめます。
境界エラーとNullを避けるチェックリスト
コードレビューで指摘されないよう、以下の点を必ず実装前に確認してください。
- 対象の文字列が
nullではないか? indexが文字列の長さ(length)を超えていないか?beginIndexはendIndexより小さいか?splitする際、区切り文字が正規表現特殊文字ではないか?indexOfの戻り値が-1(見つからない)の場合を考慮しているか?
実務で推奨される実装例
以下のコードは、外部からのデータ入力に対して防御的に記述した例です。
複数のチェックを組み合わせることで、システムの安定性を高めています。
public String extractValue(String input) {
// 1. nullチェック
if (input == null) {
return "";
}
// 2. 目的の区切り文字が含まれているか
int separatorPos = input.indexOf(":");
if (separatorPos == -1) {
return input; // 区切り文字がなければそのまま返す
}
// 3. 安全に切り出し
return input.substring(separatorPos + 1).trim();
}
このように、いきなり substring を呼ぶのではなく、事前のチェックと trim()(空白除去)などを組み合わせるのが実務の定石です。
まとめ
Javaの文字列切り出しには複数のアプローチがあり、状況に応じて最適なメソッドを選ぶ必要があります。
本記事の要点を振り返りましょう。
- substring:位置が明確な場合に使う。「終了位置は含まない」点に注意
- split:区切り文字で配列化する。ドットなどの特殊文字はエスケープ必須
- indexOf+substring:特定の文字位置を基準に、動的に切り出す
- 正規表現:複雑なパターンマッチングや抽出に利用する
特に substring を使用する際は、必ず範囲チェックを行い、IndexOutOfBoundsException を防ぐ設計を心がけてください。
文字列操作はプログラミングの基礎中の基礎ですが、ここを正確に実装できるかどうかが、バグのない高品質なアプリケーション開発への第一歩です。
つまずいたら、現役エンジニアと一緒に解決しよう
Javaの文字列処理やsubstringの境界チェックは、独学では理解が難しい部分です。実務で使えるスキルを身につけたい方は、Zerocode Onlineで体系的に学習してみませんか。
substring・split・正規表現の疑問を丁寧にサポート。
Java/SQL/Spring Bootを体系的に習得。
現場で刺さる成果物づくりを伴走。
忙しくても学習できる環境。