JavaのString検索方法を完全ガイド!contains・indexOf・startsWith・endsWithを徹底解説
生徒
「Javaで文字列の中に特定の文字が含まれているかどうかを調べたいのですが、どうすればいいですか?」
先生
「Javaでは、Stringクラスに用意されている検索用メソッドを使うのが一般的です。代表的なものにcontainsやindexOfがありますよ。」
生徒
「文字の場所を特定したり、先頭が特定の文字で始まっているか判定したりもできますか?」
先生
「もちろんです!indexOfで位置を、startsWithやendsWithで先頭・末尾の判定が可能です。使い分けが重要なので、順番に詳しく解説していきますね。」
1. Javaの文字列検索メソッドの全体像
Javaのプログラミングにおいて、文字列の中に特定のキーワードが含まれているかを確認したり、その出現位置を特定したりする操作は、非常に頻繁に行われます。ユーザーが入力したメールアドレスの形式をチェックしたり、ログファイルから特定のメッセージを探し出したりと、その用途は多岐にわたります。
Javaで文字列を扱う際には、標準で用意されているjava.lang.Stringクラスを利用します。このクラスには、検索に関する強力なメソッドが多数組み込まれています。初心者の方がまず覚えるべき主要な検索メソッドは、以下の4つです。
- contains:特定の文字列が含まれているか(真偽値)
- indexOf:特定の文字列がどこにあるか(インデックス番号)
- startsWith:特定の文字列で始まっているか(真偽値)
- endsWith:特定の文字列で終わっているか(真偽値)
これらのメソッドを適切に使い分けることで、効率的なプログラムを作成することができます。この記事では、それぞれのメソッドの具体的な使い方や注意点、実際の開発現場で役立つテクニックを詳しく紹介していきます。
2. containsメソッドで特定の文字列が含まれるか判定する
最もシンプルで使い勝手が良いのが、containsメソッドです。このメソッドは、指定した文字列(引数)が、対象の文字列の中に「含まれているかどうか」を判定し、結果をtrue(真)かfalse(偽)のいずれかで返します。
例えば、「Javaプログラミングを楽しもう」という文章の中に「Java」という単語が含まれているか知りたい場合に最適です。戻り値がboolean型であるため、if文の条件式としてそのまま利用できるのが大きなメリットです。大文字と小文字は区別されるため、「Java」と「java」は別物として扱われる点には注意が必要です。曖昧な検索を行いたい場合は、一度文字列を小文字に変換してから検索するなどの工夫が必要になります。
public class ContainsExample {
public static void main(String[] args) {
String message = "Javaの勉強を始めましょう!";
// "Java"が含まれているか確認
if (message.contains("Java")) {
System.out.println("指定した文字列が見つかりました。");
} else {
System.out.println("指定した文字列は見つかりませんでした。");
}
}
}
指定した文字列が見つかりました。
3. indexOfメソッドで出現位置を特定する
文字列が含まれているかどうかだけでなく、「どこにあるのか」を知りたい場合にはindexOfメソッドを使用します。このメソッドは、指定した文字列が最初に出現する位置を、先頭を0番目とした数値(インデックス)で返します。
もし、指定した文字列が見つからなかった場合には「-1」を返します。この「見つからない場合は-1」という仕様を利用して、indexOf("検索文字") != -1という形でcontainsメソッドの代用として使われることもありますが、現代のJava開発では、有無だけを知りたいなら可読性の高いcontainsを使い、位置が必要なときだけindexOfを使うのが一般的です。
また、文字列の後ろから検索したい場合にはlastIndexOfという兄弟メソッドも存在します。ファイル名から拡張子の位置を探す際などに、最後に出現するドット(.)を探す目的でよく使われます。
public class IndexOfExample {
public static void main(String[] args) {
String data = "user-id:12345, name:田中";
// "name:"が何文字目から始まっているかを探す
int position = data.indexOf("name:");
if (position != -1) {
System.out.println("キーワードは " + position + " 番目のインデックスにあります。");
} else {
System.out.println("キーワードが見つかりませんでした。");
}
}
}
キーワードは 15 番目のインデックスにあります。
4. startsWithとendsWithで前方・後方一致を確認する
文字列の検索において、全体のどこかではなく「最初」や「最後」だけに注目したい場合があります。例えば、URLが「https://」で始まっているかを確認したり、ファイル名の末尾が「.jpg」で終わっているかを判定したりする場合です。
このようなケースでは、startsWithメソッドとendsWithメソッドが非常に便利です。これらもcontainsと同様に、戻り値はboolean型となります。前方一致や後方一致の判定を自前で実装しようとすると、文字列の長さを計算して一部を切り出す(substring)といった複雑な処理が必要になりますが、これらの専用メソッドを使えばコードが劇的にスッキリします。初心者の方は、特定のルールに基づいた文字列のバリデーション(妥当性確認)にこれらを活用してみましょう。
public class StartEndExample {
public static void main(String[] args) {
String fileName = "sample_photo.png";
// 先頭が"sample"で始まっているか
boolean isSample = fileName.startsWith("sample");
// 末尾が".png"で終わっているか
boolean isPng = fileName.endsWith(".png");
System.out.println("sampleで始まる: " + isSample);
System.out.println("png形式である: " + isPng);
}
}
sampleで始まる: true
png形式である: true
5. 大文字と小文字を区別せずに検索するテクニック
JavaのString検索メソッドは、デフォルトですべて「大文字と小文字を厳密に区別」します。つまり、「JAVA」という文字列に対してcontains("java")を実行すると、結果はfalseになります。しかし、実際のアプリケーション開発では、ユーザーが入力する値のゆらぎを許容するために、区別せずに検索したい場面が多いものです。
その場合の最も一般的な解決策は、検索対象の文字列と、探したい文字列の両方をtoLowerCase()メソッドで小文字に統一してから検索することです。あるいはtoUpperCase()で大文字に統一しても同様の結果が得られます。この「正規化」と呼ばれる処理を挟むことで、入力ミスに強い柔軟な検索機能を実装することができます。この手法は、検索エンジンの内部処理やデータベースとの照合など、実務レベルでも頻繁に登場するパターンです。
6. 空文字やnullの扱いに注意する
文字列検索を行う際に、初心者が最も陥りやすいエラーが「NullPointerException(ぬるぽ)」です。検索対象となる変数の値がnullの場合、メソッドを呼び出そうとした瞬間にプログラムが異常終了してしまいます。これを防ぐためには、検索を実行する前に変数がnullでないことを確認するか、Java 8以降であればOptionalクラスを活用する、あるいは定数リテラルの方からメソッドを呼び出すといった工夫が必要です。
また、検索キーワードが空文字("")の場合の挙動も知っておくべきです。例えば、contains("")を実行すると、どんな文字列に対してもtrueを返します。これは論理的に「すべての文字列は空文字を含んでいる」と解釈されるためです。意図しない動作を防ぐためにも、ユーザーからの入力を受け取った直後に空文字チェックを行い、不適切な値が検索処理に回されないようにガードをかけることがプログラミングのコツです。
7. 複数条件の検索と正規表現の活用
もし「AまたはBが含まれているか」といった複雑な検索を行いたい場合、単純な検索メソッドだけではコードが長くなってしまいます。例えば「エラー」か「警告」という文字が含まれているログを抽出したい場合、containsを複数並べる必要があります。さらに高度なパターンマッチング、例えば「数字3桁-数字4桁の電話番号形式を探す」といった場合は、正規表現(Regular Expression)を使用します。
JavaではmatchesメソッドやPatternクラス、Matcherクラスを使って正規表現を扱います。今回紹介した検索メソッドは「固定の文字列」を探すのに適していますが、柔軟なパターンを探すには正規表現が必要になるというステップアップの視点を持っておくと良いでしょう。まずは基本的なメソッドをマスターし、物足りなくなったら正規表現の世界を覗いてみてください。
public class MultiSearchExample {
public static void main(String[] args) {
String log = "[ERROR] データベース接続に失敗しました。";
// 複数のキーワードのいずれかが含まれるか確認
if (log.contains("ERROR") || log.contains("FATAL")) {
System.out.println("緊急対応が必要です!");
} else {
System.out.println("正常に稼働しています。");
}
}
}
緊急対応が必要です!
8. 検索メソッドの使い分けまとめ表
最後に、どのメソッドをどのようなシーンで使うべきかを整理しましょう。目的を明確にすることで、最適なコードを選択できるようになります。
| メソッド名 | 主な用途 | 戻り値の型 |
|---|---|---|
| contains | 特定の単語が含まれているか確認する | boolean |
| indexOf | 単語の位置(何文字目か)を数値で知る | int |
| startsWith | URLのプロトコルや接頭辞を判定する | boolean |
| endsWith | ファイルの拡張子や末尾の文字を確認する | boolean |
これらのメソッドはすべて、Javaの基本中の基本でありながら、現場でも毎日使われるほど重要です。実際に自分の手でコードを書いて実行し、検索結果がどう変わるかを試してみることで、確実にスキルとして定着していきます。文字列操作に慣れることは、Javaマスターへの第一歩です。頑張って学習を続けていきましょう!