【3分Java入門】Stringで文字列が含まれているか知る方法(indexOf)

JavaのStringで文字列の中に特定の文字列が含まれているか確認したいことがあります。

「特定の文字列の有無で処理を分岐させたい」
「何文字目にあるか確認したい」

この記事ではそんな疑問を解決する「indexOf」メソッドについてわかりやすく解説します!

文字列の中に特定の文字列は含まれている?

文字列の中に特定の文字列があるか、また何文字目にあるか確認するためには、indexOfメソッドを使用します。

以下のサンプルでは特定の文字列の有無を取得しています。

public class string_indexof {

	public static void main(String[] args) {
		// 変数の宣言
		String moji1 = "あるところにおじいさんがいました";
		String moji2 = "あるところにおばあさんがいました";
		
		// 特定の文字列「おじいさん」が存在するか出力
		System.out.println("moji1の結果:" + moji1.indexOf("おじいさん"));
		System.out.println("moji2の結果:" + moji2.indexOf("おじいさん"));
		
	}
}

実行結果

moji1の結果:6
moji2の結果:-1

indexOfメソッドを使用すると存在する場合「6」、存在しない場合「-1」が出力されました。

つまり

「特定の文字列が存在する場合、先頭を0として数えた番号(要素数)を返す」
「特定の文字列が存在しない場合、-1を返す」

となり、存在の有無で処理を分岐させることができます。
※Javaでは色々な順番を1からではなく0から数えます。配列も同じ考え方です。
※indexOfメソッドが返す結果は「int型(数値)」です。

また、indexOfメソッドは指定した文字数以降から確認することもできます。

以下のサンプルでは特定の文字列の有無を指定の文字数以降から取得しています。

public class string_indexof {

	public static void main(String[] args) {
		// 変数の宣言
		String moji1 = "おじいさんとおばあさんがいました";
		
		// 特定の文字列「さん」が
		// 要素数4(5文字目)から存在するか出力
		System.out.println("moji1の結果:" + moji1.indexOf("さん",4));
		
	}
}

実行結果

moji1の結果:9

indexOfメソッドに2つ目の引数「4」を指定したため先頭ではなく5文字目から検索した結果、おじい「さん」ではなく、おばあ「さん」の要素数が出力されました。

さらにlastIndexOfメソッドを使用すれば末尾から確認することもできます。

以下のサンプルでは特定の文字列の有無を先頭ではなく末尾から取得しています。

public class string_indexof {

	public static void main(String[] args) {
		// 変数の宣言
		String moji1 = "おじいさんとおばあさんがいました";
		
		// 特定の文字列「さん」が存在するか出力
		System.out.println("moji1の結果(先頭):" + moji1.indexOf("さん"));
		System.out.println("moji1の結果(末尾):" + moji1.lastIndexOf("さん"));
		
	}
}

実行結果

moji1の結果(先頭):3
moji1の結果(末尾):9

indexOfメソッドは先頭から検索したため、おじい「さん」の要素数が出力され、lastIndexOfメソッドは末尾から検索したため、おばあ「さん」の要素数が出力されました。

2つを使用することで特定の文字列が複数あるかの確認ができます。便利ですね!

似たメソッド

indexOfメソッドに似た使い方でcontainsメソッドがあります。
どんな違いがあり、どう使い分ければよいのでしょうか?

以下のサンプルでは特定の文字列の存在有無をindexOfメソッドとcontainsメソッドで取得しています。

public class string_indexof {

	public static void main(String[] args) {
		// 変数の宣言
		String moji1 = "あるところにおじいさんがいました";
		
		// 特定の文字列「おじいさん」が存在するか出力
		System.out.println("indexOfの結果:" + moji1.indexOf("おじいさん"));
		System.out.println("containsの結果:" + moji1.contains("おじいさん"));
	
	}
}

実行結果

indexOfの結果:6
containsの結果:true

indexOfメソッドは要素数である6を出力し、containsメソッドはtrueを出力しました。

条件分岐(if)を学習した方はピンときたと思います。
contrainsメソッドが返す結果は「boolean型」です。

使い分けとしては単純に存在有無だけであればどちらでも良いですが、存在有無+文字列を抽出したい(substring)場合はindexOfメソッドを使えば、どこから抽出すればよいかも同時にわかるためオススメです。

※文字列の抽出(substring)については以下でわかりやすく説明しています。

indexOf/lastIndexOfで正規表現

indexOfメソッドやlastIndexOfメソッドを使用する上で注意点があります。

プログラムで検索といえば必ずと言っていいほど出てくる「正規表現」は使えません
(上記サンプルコードで言うと「おじいさんとおばあさん」を検索したいから「お*さん」を使う、といったこと)

テストする際のバグの原因になりますので忘れないようにしたいですね。

※正規表現については以下でわかりやすく説明しています。

まとめ

indexOfメソッドを使った特定の文字列の存在有無を取得する方法について説明しました。

プログラミングする上で「これは想定通りの値なのか」という処理は必ず行います。
想定通りでない場合思わぬ不具合が発生するからです。
(最悪の場合設計からやり直し、ということもあります)

チェックがしっかりしているプログラムは、とても良いプログラムだと思います。

もしindexOfメソッドの使い方を忘れてしまったら、この記事を思い出して下さい!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

増永

増永

WEB画面を使った業務アプリを主に開発しています。
基盤、DB構築の経験もあるため、プログラミングだけでなく幅広い内容をわかりやすく記事作成できるよう心がけています。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説